A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liqi 中级黑马   /  2014-8-19 21:28  /  2109 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在毕老师讲生产者消费者举得例子: 创建了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循环

4 个回复

倒序浏览
这个不叫循环,他说的是cpu资源的抢占机制,就是说这种情况是可能发生的,当t1再次抢到cpu后就会在if重新判断,也有可能是t2抢到cpu,这样更省了判断t1判断flag,设置flag的目的就是防止重复生产或消费,不管是t1还是t2都有机会抢到cpu的
回复 使用道具 举报
当然,只有线程才能这样来回抢占cpu
回复 使用道具 举报
每执行完一段语句时,cup就可能会暂停线程,而随机执行处于临时状态的一个线程。当t1执行完this.notify()时,t1处于临时状态,此时cup可能会抽到t1令其再次执行。
回复 使用道具 举报
不想飞不到 发表于 2014-8-20 19:19
这个不叫循环,他说的是cpu资源的抢占机制,就是说这种情况是可能发生的,当t1再次抢到cpu后就会在if重新判 ...

恩,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马