java - wait/notify 和 Condition 如何管理线程

标签 java multithreading concurrency

据我了解,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/

相关文章:

java 如何将 int[][] 转换为 BufferedImage

java - Java 中的 'this' 关键字

java - 打印GCApplicationStoppedTime

php - 在 PHP 中同步和暂停线程

java - Spring 数据 JPA 多对多检索

java - Java序列化-实现细节泄漏

c# - ThreadPool.SetMinThreads 在 IIS 托管应用程序中不起作用

java - Ref to map vs. map to refs vs. multiple refs

java - 为什么在类 jsr166e.Striped64.Cell 中对值字段进行额外填充?

concurrency - 竞争和死锁的区别