黑马程序员技术交流社区
标题:
线程间通信的问题
[打印本页]
作者:
付龙
时间:
2013-7-19 22:01
标题:
线程间通信的问题
本帖最后由 杨兴庭 于 2013-7-22 21:26 编辑
两个while的{}加与不加有什么区别? 加上以后为什么执行结果不对呢
public class Resouse {
//定义标记判断是否有盐
private boolean flag = false;
public synchronized void cook(){
while(!flag)
// { <font size="4">加与不加的区别</font>
try {
System.out.println("妈妈:没有盐了,儿子去买些盐");
this.wait();//线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("妈妈:盐买回来了,继续做饭");
flag = false;//切换标记
this.notifyAll();//唤醒所有线程
}
// }
public synchronized void buySalt(){
while(flag)
// { <font size="4">加与不加的区别</font>
try {
this.wait();//线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("儿子:好的,我马上去买盐");
try {
Thread.currentThread().sleep(1000);//线程休眠
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("儿子:妈妈,买回来了");
flag = true;//切换标记
this.notifyAll();//唤醒所有等待
// }
}
}
复制代码
作者:
下雨天
时间:
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