关于多线程的问题

来源:互联网 发布:易幻网络面试 编辑:程序博客网 时间: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();
}

}

























0 0
原创粉丝点击