然而(如果我正确理解了这些方法之间的区别),只有一个线程总是被 Select 用于进一步的监视器采集.
这是不对的.o.notifyAll()
唤醒o.wait()
次呼叫中被阻止的all个线程.线程只能从o.wait()
一个接一个地返回,但每个线程都有自己的轮到.
简单地说,这取决于线程等待通知的原因.你是想告诉一个等待的线程发生了什么事,还是想同时告诉所有线程?
在某些情况下,等待结束后,所有等待线程都可以采取有用的操作.例如,一组等待某个任务完成的线程;一旦任务完成,所有等待的线程都可以继续它们的事务.在这种情况下,您可以使用notfyAll()同时唤醒所有等待的线程.
另一种情况,例如互斥锁定,只有一个等待的线程在收到通知后才能执行有用的操作(在本例中,获取锁).在这种情况下,您宁愿使用notify().如果实现得当,在这种情况下,也可以使用notifyAll(),但不必要地唤醒那些无论如何都不能做任何事情的线程.
在许多情况下,等待条件的代码将被编写为循环:
synchronized(o) {
while (! IsConditionTrue()) {
o.wait();
}
DoSomethingThatOnlyMakesSenseWhenConditionIsTrue_and_MaybeMakeConditionFalseAgain();
}
这样,如果一个o.notifyAll()
调用唤醒了多个正在等待的线程,并且第一个从o.wait()
make返回的线程将状态保持为false,那么被唤醒的其他线程将返回等待状态.