据我了解,wait()
和 notify()/notifyAll()
方法的目的是替换其他语言中使用的传统循环/轮询结构:
while(true) {
if(pollSomethingForAnEvent())
break;
}
我进一步了解到,Java 5 中引入了 Condition
API,以便将此模型封装在更“OO”的实现中。
我不明白是Java如何知道当Object.notify()
或Condition.signal()
时要通知哪些线程被调用,或者 Java 如何知道调用 Object.wait()
或 Condition.await()
向哪些线程发出信号?
由于这些方法不接受任何内容作为参数,JVM 如何知道将这些通知传递给哪些线程?!?!
最佳答案
对于每个条件
或同步对象,JVM 维护一个等待它们的对象队列。它还具有运行队列和其他数据结构,用于维护和管理线程
运行状态。
当调用Object.notify()
时,它只是在与该对象关联的队列中查找并获取第一个Thread
并将其移动到运行队列。如果队列为空,则不会通知任何线程。如果调用了 notifyAll()
,则等待该对象的所有线程都会收到信号。
不要让事情复杂化,但需要意识到的一件事是,当调用 lockObject.wait()
的 Thread
收到通知时,它会从等待状态移出状态到运行队列的末尾,等待访问lockObject
上的锁。它不会立即开始运行。
关于java - wait/notify 和 Condition 如何管理线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10365094/