黑马程序员技术交流社区

标题: 线程间通信的问题 [打印本页]

作者: 付龙    时间: 2013-7-19 22:01
标题: 线程间通信的问题
本帖最后由 杨兴庭 于 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. }
复制代码

作者: 下雨天    时间: 2013-7-19 22:55
首先在cook()里执行到了wait()  但是flag还是等于false 所以buySalt()也不会执行 那么程序就无限等待了
作者: yinjiek    时间: 2013-7-20 00:03
不加{}while后面只能执行一条语句;而{}中是代码块所以无法执行:
作者: liuzhming    时间: 2013-7-21 23:21
这是一个线程互斥与同步的问题。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方法的线程一直等待下去。

作者: liuzhming    时间: 2013-7-21 23:24
上面的false写错了,应该是flag




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2