当前位置: 首页 > 知识库问答 >
问题:

如何使用notifyAll来确保唤醒后只有一个线程继续?

凤经国
2023-03-14

若要恢复挂起在给定对象上的线程,其他一些线程必须在引用相同对象的同步语句或方法中执行预先定义的方法notify。和wait一样,notify也没有参数。作为对notify调用的响应,语言运行时系统选择挂起在对象上的任意线程并使其可运行。如果没有这样的线程,那么通知是一个无操作。就像在Mesa中一样,有时唤醒在给定对象中等待的所有线程可能是合适的;Java为此提供了一个内置的notifyAll方法。

如果线程等待一个以上的条件(即,如果它们的等待嵌入到不同的循环中),则不能保证“正确的”线程将被唤醒。为了确保适当的线程确实被唤醒,程序员可以选择使用notifyAll而不是Notify。为了确保只有一个线程在唤醒后继续,发现其条件已被满足的线程必须修改对象的状态,以便其他被唤醒的线程在运行时简单地回到睡眠状态。不幸的是,由于所有等待线程在每次其中一个可以运行时都将重新评估它们的条件,这种多条件问题的“解决方案”可能相当昂贵。

>

  • 当使用notifyall时,所有唤醒线程都将争用重新获取锁,但只有一个线程可以重新获取锁,然后从wait()返回,然后重新计算条件。那么为什么它说“所有等待的线程将在每次其中一个可以运行时重新评估它们的条件”呢?

    谢了。

  • 共有1个答案

    司空炯
    2023-03-14

    那么为什么它说“所有等待的线程将在每次其中一个可以运行时重新评估它们的条件”呢?

    在它重新获取并释放锁之后,一个不同的线程将引用它并运行。这将继续下去,直到他们都那样做。

    重新获得锁并重新检查条件是否为真的线程如何“以这样的方式修改对象的状态,使其他被唤醒的线程在运行时简单地回到睡眠状态”?

    while (condition) {
        wait();
    }
    
    condition = true;
    
     类似资料:
    • 我有2个工作线程和1个处理线程。 当处理线程正在尝试处理某些事情,而辅助线程正在执行它们的工作时,处理线程应该等待,并且在辅助线程中执行的所有作业完成时唤醒。 我怎样才能唤醒这根线?我将尝试演示我在这段伪代码中的意思 处理线程类似于 这样的事情可能发生吗?让线程等待到多个调用notifyAll()的源,而不是只等待一次。我希望我把这个问题弄清楚了。 多谢帮忙!

    • 本文向大家介绍Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll),包括了Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll)的使用技巧和注意事项,需要的朋友参考一下 本篇我们来研究一下 wait() notify() notifyAll() 。 DEMO1: wait() 与 notify() DEMO1 输出: 注意: 使用 wait

    • 问题内容: 我有以下方法: 从视图中调用它: 如您所见,_attempt方法期望actor为type ,但是该对象似乎为type 。为什么会这样呢?更重要的是,如何将(显然是User对象的一种包装器)转换为对象? 有关更多信息,请参见:https : //docs.djangoproject.com/en/dev/ref/request- response/#django.http.HttpReq

    • 本文向大家介绍HTML5如何唤醒APP?相关面试题,主要包含被问及HTML5如何唤醒APP?时的应答技巧和注意事项,需要的朋友参考一下 有以下几种方式 URL Scheme:最常见 Intent: // :Android Universal Link : iOS, 通过传统的 HTTP 链接即可打开 APP 唤醒途径 iframe的src a标签的src window.location 参考资料:

    • 假设10个进程使用sem_wait(). 等待一个信号量,第11个进程调用该信号量的sem_post。 10个进程中哪一个将进入临界块? 像随机吗?所有进程将被唤醒并努力实现锁。 ,CPU将为其中一个进程提供锁,其余的进程将返回等待状态