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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 萧萧北 中级黑马   /  2013-6-4 11:34  /  1286 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 萧萧北 于 2013-6-5 09:01 编辑
  1. public synchronized void set(String name)
  2. {
  3. // t1 t2
  4. if(flag)     //while(flag)   
  5. try {this.wait();} catch (Exception e) {} //t1 放弃资格
  6. this.name=name+"--"+count++;
  7. System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
  8. flag=true;
  9. this.notifyAll(); //一般唤醒线程池中第一个
  10. }
复制代码
第12天视频中 ,将if判断改为while判断,不太明白这里if 和while的区别,请大家都来结合具体题目说说这是怎么回事,为什么非得使用while?

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

4 个回复

倒序浏览
增加安全性。。防止伪唤醒
回复 使用道具 举报
使用if的话 只会判断一次  while是一个循环判断 就是说当前线程执行完同步代码后  还能有机会回到while语句再次判断  和别的等待的线程竞争 争夺执行  楼主觉得这样说是否合理

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
lz 你这是两个生产者两个消费者的问题,至于为什么用while不用if,那是因为当你其中一个生产者t1进入等待状态wait()时而t2在执行下面程序时this.name=name+"--"+count++;(假如count=1),执行完后flag=true他也进入等待中,这时t1,t2都在线程池中等待,而t2是先进去的,等到下一次消费者唤醒线程池this.notify();时t2先醒来,t2的位置在try {this.wait();} catch (Exception e) {}这里,醒来后是if(flag),他就不会再去判断flag是否还是true就继续执行this.name=name+"--"+count++;这导致生产者一下生产了两(本题原意是生产一个消费一个吧,楼主)    醒来后是while(flag) ,他就会在判断flag,这时他知道flag为true就不会在生产。

不知道楼主是否能明白我的意思,其实毕老师day12-5视频中讲得很清楚,你可以多看几遍,还有指出lz你的一个小错误:09.this.notifyAll(); //一般唤醒线程池中的所有线程不是一个;this.notify();才是唤醒线程池中第一个。

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
很简洁的说,就是if只判断一次,而while是判断一次后,进入循环,再次判断。而此处需要再次判断。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马