我了解wait()
和notify()/notifyAll()
方法的目的是替换其他语言中使用的传统循环/轮询结构:
while(true) {
if(pollSomethingForAnEvent())
break;
}
我进一步理解,Java 5中引入了Condition
API,以便在更“OO”的实现中包装此模型。
我不理解是Java如何知道在调用Object.notify()
或Condition.signal()
时要通知哪些线程,或者Java如何知道哪些线程要用{{{ 1}}或Object.wait()
被称为?
由于这些方法不接受任何参数,JVM如何知道将这些通知传递给哪些线程?!?!
答案 0 :(得分:2)
对于每个Condition
或同步对象,JVM维护一个等待它们的对象队列。它还具有运行队列和其他数据结构,用于维护和管理Thread
运行状态。
当调用Object.notify()
时,它只是查找与该对象关联的队列,并在那里获取第一个Thread
并将其移动到运行队列。如果队列为空,则不通知任何线程。如果调用notifyAll()
,则会发信号通知正在该对象上等待的所有线程。
不要使问题复杂化,但重要的一件事是,当通知Thread
lockObject.wait()
时,它会从等待状态转移到结尾等待访问lockObject
上的锁的运行队列的>。它不会立即开始运行。