0

我了解wait()andnotify()/notifyAll()方法的目的是替换其他语言中使用的传统循环/轮询结构:

while(true) {
    if(pollSomethingForAnEvent())
        break;
}

我进一步了解,ConditionAPI 是在 Java 5 中引入的,以便将此模型包装在更“OO”的实现中。

不明白Object.notify()的是Java如何知道在何时或被Condition.signal()调用时通知哪些线程,或者Java如何知道向哪些线程发出信号Object.wait()或被Condition.await()调用?

由于这些方法不接受任何参数,JVM 怎么知道将这些通知传递给哪些线程?!?!

4

1 回答 1

2

对于每个Condition或同步对象,JVM 维护一个等待它们的对象队列。它还具有运行队列和其他维护和管理Thread运行状态的数据结构。

Object.notify()被调用时,它只是在与对象关联的队列中查找第一个Thread并将其移动到运行队列。如果队列为空,则不通知线程。如果notifyAll()被调用,那么所有等待该对象的线程都会收到信号。

不要让事情复杂化,但需要意识到的重要一件事是,当通知Thread调用的 a 时lockObject.wait(),它会从等待状态移动到运行队列的末尾,等待访问 lock on lockObject。它不会立即开始运行。

于 2012-04-28T15:52:49.367 回答