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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 吴建昆 于 2013-5-2 23:10 编辑

毕老师讲多线程之间的通信时,讲生产者消费者问题,其中有这样一段代码
  1. public synchronized void set(String name)
  2.         {
  3.                 if(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.         }
复制代码
说if(flag) try{this.wait();}catch(Exception e){}//t1(获取资格)  t2(放弃资格)
这句,如果刚开始t1获取执行资格,执行生产代码后把flag置为true,再把t2唤醒,然后自己进入等待状态,此时t2会从等待的位置直接向下走,做出生产动作,而不会判断if语句中flag的值。结果造成连续生产两次的错误。到这里我是理解的。但下面就想不通了。
   老师把if换成了while,即while(flag) try{this.wait();}catch(Exception e){}//t1(获取资格)  t2(放弃资格)
这个时候为什么t2被唤醒后不继续向下执行了,而去读取while中flag的值了呢?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 itheima01 于 2013-5-1 15:23 编辑

我也有这样的疑惑。求大神帮忙解答 代码块里面的代码还没有执行完呢,怎么回去判断flag 即便是while 也待执行完方法体才能接着判断。
回复 使用道具 举报
这就涉及到if与while的区别了。
if是判断语句,格式为
if(判断条件){
     执行代码1;
}
执行代码2;
当判断条件为true时,会执行大括号中的执行代码1,执行完后继续向下执行代码2;
当判断条件为false时,不会执行大括号中的执行代码1,而是直接向下执行代码2。

而while是循环结构,格式为
while(判断条件){
    循环体执行代码1;
}
执行代码2;
当判断条件为true时,会执行大括号中的循环体执行代码1,执行完后再判断条件,
如此循环,知道判断条件为false时,不再执行循环体,而是直接向下执行代码2.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
很简单的说 if只判断了一次  而while它循环判断多次条件   还有写if语句尽量别省略了代码块  
回复 使用道具 举报
t2被唤醒后是向下执行的哦。


我们先从最开始的时候flag=false:
1、(flag=false)最开始假如生产者先抢到cpu调用set方法while(flag) try{this.wait();}catch(Exception e){}这段代码不会被执行到。
                   可以接着执行下面的代码flage=ture;this.notifyAll();
                   因为方法锁上了中途就算中途生产者失去了执行权别的线程不可以进来执行代码。
                   this.notifyAll();唤醒了所有等待线程。
   (flage=ture)1.1生产者抢到线程因flage=ture,等待
   (flage=ture)1.2消费者抢到线程一直执行完代码中途不会等待最后flag=false。
   
2、(flag=false)最开始假如消费者先抢到cpu调用out方法while(!flag) try{this.wait();}catch(Exception e){}这段代码被执行。消费者等待。
                 假如消费者还是再继续抢到cpu调用out方法。因为已经锁上。不能执行只能等待。
                 生产者抢到cpu那么就一直执行set方法不会主动放弃cpu
思路不太好不知道看懂没

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
郑雪 发表于 2013-5-1 15:21
这就涉及到if与while的区别了。
if是判断语句,格式为
if(判断条件){

哥们的这句话一下点醒了我:如此循环,直到判断条件为false时,不再执行循环体,而是直接向下执行代码2.

我想我应该明白了,意思是只要while(flag)中的flag为真,t2就永远无法跳出这个循环,呵呵  所以它只能等到flag为假时才能出去活动。
回复 使用道具 举报
if是分支判断,while是循环嘛
回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马