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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张聪珉 中级黑马   /  2013-8-12 13:39  /  975 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看代码,俩生产线程t1,t2。俩消费线程t3,t4。当把while改成if的时候可能出现生产2个消费1次,生产1个消费2次的情况,问题一:假如t1生产完一个之后会返回来继续判断(flag),但是毕老师在讲解if换成while时解释说:“if是不是只判断一次?我们如果变成while是不是判断多次,对不大家?”(视频12天—5,19:00—20:00分钟),那这不前后矛盾了吗?再来下面代码用while来循环,问题二  假如:t2在while判断为true的try语句之后在这里wait(),而后被notify获取到了执行资格也抢到cpu执行权,这里为什么t2线程不是继续往下执行而是再回到while这里判断

(flag),不是应该从try语句后继续执行再回来判断吗? 我快晕了{:soso_e135:}
  1. public synchronized void set(String name)
  2.         {
  3.                 while(flag)
  4.                         try{this.wait();}catch(Exception e){}//t1(放弃资格)  t2(获取资格)
  5.                 this.name = name+"--"+count++;

  6.                 System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
  7.                 flag = true;
  8.                 this.notifyAll();
  9.         }


  10.         //  t3   t4  
  11.         public synchronized void out()
  12.         {
  13.                 while(!flag)
  14.                         try{wait();}catch(Exception e){}//t3(放弃资格) t4(放弃资格)
  15.                 System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
  16.                 flag = false;
  17.                 this.notifyAll();
  18.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
以防万一 + 1 发现问题并解决问题。加油~

查看全部评分

2 个回复

倒序浏览
首先回答楼主的第一个问题:用if的时候只判断一次,于是就产生了生产者消费者问题,即出现生产2个消费1次,生产1个消费2次的情况;楼主需要理解这样产生的根本原因是什么,其实是因为if只判断一次flag值,所以当等待的线程再次被唤醒的时候不用再判断了,直接可以进入下一步执行代码了;而你用while的时候,因为while是循环,当你的那些被重新唤醒的线程想要再次进入之前必须再被判断flag值,符合就进入try继续等待,这样就解决了生产者消费者问题了。老毕没讲错哈。
至于第二个问题其实也是一个意思,用while循环时,所有被重新唤醒的等待线程都需要重新判断一次flag标记值,当然就是要先回到while里判断啦。
就这样了

评分

参与人数 1技术分 +1 收起 理由
以防万一 + 1 加上代码就更完美了

查看全部评分

回复 使用道具 举报
本帖最后由 清心玉质 于 2013-8-13 15:47 编辑

问题一:假如t1生产完一个之后会返回来继续判断(flag),但是毕老师在讲解if换成while时解释说:“if是不是只判断一次?我们如果变成while是不是判断多次,对不大家?”(视频12天—5,19:00—20:00分钟),那这不前后矛盾了吗?
t1生产完一个之后会返回来继续判断(flag),不是if语句的判断作用,而是因为其他线程都在wait中,只有t1有执行权,如果没有执行到t1的wait条件,它就会一直执行。
问题二  假如:t2在while判断为true的try语句之后在这里wait(),而后被notify获取到了执行资格也抢到cpu执行权,这里为什么t2线程不是继续往下执行而是再回到while这里判断(flag),不是应该从try语句后继续执行再回来判断吗?
其实这个问题主要是对while不够了解,你可以这么看:
while(执行条件)
执行语句1;
执行语句2;
当满足执行条件时,执行的是1语句,再回去判断执行条件,如果不满足,才会执行到2语句。t2从1处醒来,肯定要回去判断执行条件的,后面的你就可以多想想了,比如条件是否满足 ,执行什么语句。


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