wait / notify和Condition如何管理线程

时间:2012-04-28 15:48:32

标签: java multithreading concurrency

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

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

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

不理解是Java如何知道在调用Object.notify()Condition.signal()时要通知哪些线程,或者Java如何知道哪些线程要用{{{ 1}}或Object.wait()被称为?

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

1 个答案:

答案 0 :(得分:2)

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

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

不要使问题复杂化,但重要的一件事是,当通知Thread lockObject.wait()时,它会从等待状态转移到结尾等待访问lockObject上的锁的运行队列的>。它不会立即开始运行。