*)
wait/notify 机制
通常,多线程之间需要协调工作。例如,浏览器的一个显示图片的线程 ! 想要
执行显示图片的任务,必须等待下载线程 将该图片下载完毕。如果图片还
没 有 下 载 完 , ! 可 以 暂 停 , 当 完 成 了 任 务 后 , 再 通 知
!@图片准备完毕,可以显示了”,这时,! 继续执行。
以上逻辑简单的说就是:如果条件不满足,则等待。当条件满足时,等待该条件的线程将
被唤醒。在 中,这个机制的实现依赖于 <0!。等待机制与锁机制是密切关联的。
例如:
!5"
####1"
$########
(####)
*####%&-
:)
当线程 6 获得了 锁后,发现条件 不满足,无法继续下一处理,于是线程 6 就
。
在另一线程 7 中,如果 7 更改了某些条件,使得线程 6 的 条件满足了,就可以唤
醒线程 6:
!5"
####
$####0!
()
需要注意的概念是:
A 调 用 的 3 0! 方 法 前 , 必 须 获 得 锁 , 也 就 是 必 须 写 在
!5#")代码段内。
A调用 后,线程 6 就释放了 的锁,否则线程 7 无法获得 锁,也就无法在
!5")代码段内唤醒 6。
A当 方法返回后,线程 6 需要再次获得 锁,才能继续执行。
A如果 63636$ 都在 ,则 7 调用 0!只能唤醒 63636$ 中的一个(具体
哪一个由 8 决定)。
A0!6则能全部唤醒 63636$,但是要继续执行 的下一条语句,必须获
得 锁,因此,63636$ 只有一个有机会获得锁继续执行,例如 6,其余的需要等待
6 释放 锁之后才能继续执行。
A当 7 调用 0!<0!6 的时候,7 正持有 锁,因此,63636$ 虽被唤醒,但是
仍无法获得 锁。直到 7 退出 !5 块,释放 锁后,63636$ 中的一个才有机
会获得锁继续执行。