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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 付龙 中级黑马   /  2013-7-19 22:01  /  992 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-22 21:26 编辑

两个while的{}加与不加有什么区别?  加上以后为什么执行结果不对呢
  1. public class Resouse {
  2.         //定义标记判断是否有盐
  3.         private boolean flag  = false;
  4.          
  5.         public synchronized void cook(){
  6.                 while(!flag)
  7. //                { <font size="4">加与不加的区别</font>
  8.           try {
  9.                                 System.out.println("妈妈:没有盐了,儿子去买些盐");
  10.                                 this.wait();//线程等待
  11.                         } catch (InterruptedException e) {
  12.                                 e.printStackTrace();
  13.                         }
  14.                
  15.                 System.out.println("妈妈:盐买回来了,继续做饭");
  16.                 flag = false;//切换标记
  17.                 this.notifyAll();//唤醒所有线程
  18.         }
  19. //        }
  20.         public synchronized void buySalt(){
  21.                
  22.                 while(flag)
  23. //                {  <font size="4">加与不加的区别</font>
  24.                         try {
  25.                                 this.wait();//线程等待
  26.                         } catch (InterruptedException e) {
  27.                                 e.printStackTrace();
  28.                         }
  29.                         
  30.                         System.out.println("儿子:好的,我马上去买盐");
  31.                         try {
  32.                                 Thread.currentThread().sleep(1000);//线程休眠
  33.                         } catch (InterruptedException e) {
  34.                                 e.printStackTrace();
  35.                         }
  36.                         System.out.println("儿子:妈妈,买回来了");
  37.                         flag = true;//切换标记
  38.                         this.notifyAll();//唤醒所有等待
  39. //                }
  40.         }
  41. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

4 个回复

倒序浏览
首先在cook()里执行到了wait()  但是flag还是等于false 所以buySalt()也不会执行 那么程序就无限等待了

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
不加{}while后面只能执行一条语句;而{}中是代码块所以无法执行:

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
liuzhming 来自手机 中级黑马 2013-7-21 23:21:35
板凳
这是一个线程互斥与同步的问题。flag等价于操作系统中的互斥信号量。我们来分析一下这段代码。当第一个线程执行cook方法时,while循环判断flag为假,进入循环,此时线程因执行wait方法而等待,并释放锁。若有另一个线程执行buySalt方法,判断false为假,跳过循环,执行后面的代码。线程先休眠1秒钟,打印字符串,将flag转为true,这条语句是让cook方法进入临界资源(也就是循环后面的代码),最后唤醒所有等待的线程。这样,刚才的线程将从等待状态转换为就绪状态,但执行时必须再次进行while判断,这是为了获得临界资源的使用权。此时,cook方法while判断flag为真,跳过循环,可以执行后面的代码。如果我们将buySalt方法中代码都放到while循环中,则由于false为假,跳过循环,while里面的语句一条也不会执行,那么所有执行cook方法的线程都会无限期地等待下去,因为能把它们唤醒的代码没有执行。如果cook方法中代码都在while中,而buySalt方法中的代码没有放在while中,则会因为buysalt方法修改flag为真,使得cook中while循环跳过,里面的代码不能执行,导致执行buysalt方法的线程一直等待下去。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 下次小心单词

查看全部评分

回复 使用道具 举报
liuzhming 来自手机 中级黑马 2013-7-21 23:24:15
报纸
上面的false写错了,应该是flag
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马