黑马程序员技术交流社区

标题: 线程生产者消费者 [打印本页]

作者: liqi    时间: 2014-8-19 21:28
标题: 线程生产者消费者
在毕老师讲生产者消费者举得例子: 创建了4个线程:在讲解出现生产两个,消费一个的原因时,t1.t2,t3,t4
class Resource{
private String name;
private boolean flag = false;
private int count=1;
               // t1 t2
public synchronized void set(String name){
if(flag)
       try(this.wait();)catch(Exception e){}
this.name = name+"--"+count++;
System.out.println();
flag=true;
this.notify();
}
// t3 t4
public synchronized void out(String name){
if(!flag)
       try(this.wait();)catch(Exception e){}
this.name = name+"--"+count++;
System.out.println();
flag=true;
this.notify();
}
}
老师讲的是 t1 运行完set方法最后一句this.notify();,又循环判断if(flag) 条件为真,所以等待;
这里是if选择语句,怎么会循环?不是运行到最后一句就退出?这里又不是while循环
作者: 不想飞不到    时间: 2014-8-20 19:19
这个不叫循环,他说的是cpu资源的抢占机制,就是说这种情况是可能发生的,当t1再次抢到cpu后就会在if重新判断,也有可能是t2抢到cpu,这样更省了判断t1判断flag,设置flag的目的就是防止重复生产或消费,不管是t1还是t2都有机会抢到cpu的
作者: 不想飞不到    时间: 2014-8-20 19:20
当然,只有线程才能这样来回抢占cpu
作者: 新航向    时间: 2014-8-20 22:12
每执行完一段语句时,cup就可能会暂停线程,而随机执行处于临时状态的一个线程。当t1执行完this.notify()时,t1处于临时状态,此时cup可能会抽到t1令其再次执行。
作者: liqi    时间: 2014-8-21 20:15
不想飞不到 发表于 2014-8-20 19:19
这个不叫循环,他说的是cpu资源的抢占机制,就是说这种情况是可能发生的,当t1再次抢到cpu后就会在if重新判 ...

恩,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2