Java多线程筹划情势 - wait/notify机制[Java编程]
本文“Java多线程筹划情势 - wait/notify机制[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
普通,多线程之间需求调和工作.比方,浏览器的一个显示图片的线程 displayThread想要履行显示图片的任务,必须等候下载线程downloadThread将 该图片下载完毕.假如图片还没有下载完,displayThread可以暂停,当 downloadThread完成了任务后,再告诉displayThread“图片预备完毕,可 以显示了”,这时,displayThread持续履行.
以上逻辑简单的说就是:假如条件不满意,则等候.当条件满意时,等候该 条件的线程将被唤醒.在Java中,这个机制的实现依靠于wait/notify.等候机 制与锁机制是密切关联的.比方:
synchronized(obj) {
while(!condition) {
obj.wait();
}
obj.doSomething();
}
当线程A得到了obj锁后,发现条件condition不满意,无法持续下一处理,于 是线程A就wait().
在另一线程B中,假如B更改了某些条件,使得线程A的condition条件满意了 ,便可以唤醒线程A:
synchronized(obj) {
condition = true;
obj.notify();
}
需求注意的概念是:
◆调用obj的wait(), notify()办法前,必须得到obj锁,也就是必须写在 synchronized(obj) {...} 代码段内.
◆调用obj.wait()后,线程A就释放了obj的锁,不然线程B无法得到obj锁, 也就无法在synchronized(obj) {...} 代码段内唤醒A.
◆当obj.wait()办法返回后,线程A需求再次得到obj锁,才能持续履行.
◆假如A1,A2,A3都在obj.wait(),则B调用obj.notify()只能唤醒A1,A2,A3中 的一个(具体哪一个由JVM决意).
◆obj.notifyAll()则能全部唤醒A1,A2,A3,但是要持续履行obj.wait()的下 一条语句,必须得到obj锁,因此,A1,A2,A3只有一个有机会得到锁持续履行, 比方A1,别的的需求等候A1释放obj锁之后才能持续履行.
◆当B调用obj.notify/notifyAll的时刻,B正持有obj锁,因此,A1,A2,A3虽 被唤醒,但是仍无法得到obj锁.直到B退出synchronized块,释放obj锁后, A1,A2,A3中的一个才有机会得到锁持续履行.
以上是“Java多线程筹划情势 - wait/notify机制[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |