关于多线程的问题
来源:互联网 发布:易幻网络面试 编辑:程序博客网 时间:2024/05/29 03:44
/*
* 第一次写博客,写的不好请见谅
*/
/*
* 刚看完多线程在这期间遇到了一点问题,所以写一点关于多线程实现的可能遇到的疑问,希望对后来的学者有所帮助
* 如有错误欢迎指正。
*
* 怎么理解多线程,操作系统有多核和单核处理机,对于多线程的下载工具,如迅雷,
* 在单核操作系统中它相当于增加了系统运行下载程序的频率从而加快了下载速度,
* 而对于有多个处理机的操作系统,多线程能真正的实现所下载的资源的不同部分在两个处理机上同时进行下载,
* 从而加快下载速度。从这个角度看多线程是增加了占用CPU的运行时间,从而提高对应应用程序的运行效率。
*
* 但多线程其实是为了程序的多个模块部分能并发(在多核操作系统中能实现并行)执行而设计的。
*
*/
/*
* 我遇到的问题是在多线程处理多生产者与多消费者问题时,问什么会出现生产者生产多次儿消费者只消费一次的情况,
* 这不符合同步方法的要求。当一个生产者进行生产时它会执行同步方法并锁定“拥有该方法对象的锁”,
* 其它生产者不应该能够再生产,那么问题出在那里,正如老师说的,一切问题都有解释,你认真理解了问题并仔细分析,定能找到问题所在
* 具体描述见代码部分。
*/
package multiThread;
//多线程用于操作的资源
class Resource {
//同步方法
public synchronized void out(Thread t) {
for(int i = 0; i < 100; i++) {
//注释掉这部分代码会发现线程1会等到线程0执行完毕才执行,说明当线程0执行时确实获得
了Resource资源类的锁,
//取消注释,当调用wait语句时会发现进程0、1出現交替运行情況,说明wait操作会让进程释
放掉当前占用的资源,
//即使该线程已经进入到了同步方法中。
/*
try {
wait(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
//简单的打印输出语句
System.out.println(t.getName() + "....." + i);
}
}
}
//定义多线程所要运行的代码的封装类
class MyRunnable implements Runnable {
//资源对象
private Resource res;
//构造函数,在创建对象时传入参数
public MyRunnable(Resource res) {
this.res = res;
}
@Override
//多线程所要运行的代码块
public void run() {
// TODO Auto-generated method stub
//调用资源类中的方法
res.out(Thread.currentThread());
}
}
public class MutilThreadDemon {
public static void main(String[] args) {
//定义资源并传递给MyRunnable对象,
MyRunnable mr = new MyRunnable(new Resource());
//创建进程
Thread t1 = new Thread(mr);
Thread t2 = new Thread(mr);
//启动进程
t1.start();
t2.start();
}
}
* 第一次写博客,写的不好请见谅
*/
/*
* 刚看完多线程在这期间遇到了一点问题,所以写一点关于多线程实现的可能遇到的疑问,希望对后来的学者有所帮助
* 如有错误欢迎指正。
*
* 怎么理解多线程,操作系统有多核和单核处理机,对于多线程的下载工具,如迅雷,
* 在单核操作系统中它相当于增加了系统运行下载程序的频率从而加快了下载速度,
* 而对于有多个处理机的操作系统,多线程能真正的实现所下载的资源的不同部分在两个处理机上同时进行下载,
* 从而加快下载速度。从这个角度看多线程是增加了占用CPU的运行时间,从而提高对应应用程序的运行效率。
*
* 但多线程其实是为了程序的多个模块部分能并发(在多核操作系统中能实现并行)执行而设计的。
*
*/
/*
* 我遇到的问题是在多线程处理多生产者与多消费者问题时,问什么会出现生产者生产多次儿消费者只消费一次的情况,
* 这不符合同步方法的要求。当一个生产者进行生产时它会执行同步方法并锁定“拥有该方法对象的锁”,
* 其它生产者不应该能够再生产,那么问题出在那里,正如老师说的,一切问题都有解释,你认真理解了问题并仔细分析,定能找到问题所在
* 具体描述见代码部分。
*/
package multiThread;
//多线程用于操作的资源
class Resource {
//同步方法
public synchronized void out(Thread t) {
for(int i = 0; i < 100; i++) {
//注释掉这部分代码会发现线程1会等到线程0执行完毕才执行,说明当线程0执行时确实获得
了Resource资源类的锁,
//取消注释,当调用wait语句时会发现进程0、1出現交替运行情況,说明wait操作会让进程释
放掉当前占用的资源,
//即使该线程已经进入到了同步方法中。
/*
try {
wait(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
//简单的打印输出语句
System.out.println(t.getName() + "....." + i);
}
}
}
//定义多线程所要运行的代码的封装类
class MyRunnable implements Runnable {
//资源对象
private Resource res;
//构造函数,在创建对象时传入参数
public MyRunnable(Resource res) {
this.res = res;
}
@Override
//多线程所要运行的代码块
public void run() {
// TODO Auto-generated method stub
//调用资源类中的方法
res.out(Thread.currentThread());
}
}
public class MutilThreadDemon {
public static void main(String[] args) {
//定义资源并传递给MyRunnable对象,
MyRunnable mr = new MyRunnable(new Resource());
//创建进程
Thread t1 = new Thread(mr);
Thread t2 = new Thread(mr);
//启动进程
t1.start();
t2.start();
}
}
0 0
- 关于多线程的问题
- 关于多线程的问题
- 关于多线程的问题
- 关于多线程的问题
- 关于多线程使用的问题
- 关于fork的多线程问题
- 关于下载工具的多线程问题
- 关于python的多线程问题
- iOS关于多线程的问题
- 关于多线程调用的问题
- 关于多线程的问题总结
- 关于microwindows中多线程的问题
- 关于多线程里内存分配的问题
- 关于JUNIT的多线程测试问题
- 关于gtk多线程修改界面的问题
- 一个关于多线程同步问题的分析
- 【MS】关于多线程的死锁问题
- 关于多线程多连接的问题
- 从头到尾彻底理解傅里叶变换算法、下
- 【学习过程】二叉树的一些操作
- 线程池的使用
- 多项式乘法与快速傅里叶变换
- 3.条件判断和循环
- 关于多线程的问题
- Java线程池使用说明
- FileItem类
- 太白---落燕纷飞第一重 Android单元测试Instrumentation和irobotium
- 性能优化
- POJ1062 昂贵的聘礼
- 2015-6-5(纠结的问题)
- DuiLib : CControlUI->SetAttribute(L"pos"后, 属性不生效的问题
- Storyboard-故事板