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

如果有两个线程调用SignalAll,如何唤醒线程?

岳硕
2023-03-14

我有2个工作线程和1个处理线程。

当处理线程正在尝试处理某些事情,而辅助线程正在执行它们的工作时,处理线程应该等待,并且在辅助线程中执行的所有作业完成时唤醒。

我怎样才能唤醒这根线?我将尝试演示我在这段伪代码中的意思

class Worker{
      /... variables ../
     private final Condition condition;
     public Worker(Condition condition){
        // constructor
     } 

     public void start(){
        Thread thread = new Thread(this::run);
        thread.start();
     }

     private void run(){
        try{
            ...
            condition.signalAll();    
        }
     }
}

处理线程类似于

      class Processing{
          private final Lock lock = new ReentrantLock();
          private final Condition condition = lock.newCondition();
          public void start(){
    
            Worker worker1 = new Worker(condition);
            Worker worket2 = new Worker(condition);
            worker1.start();
            worker2.start();
    
            // some code //
            while( // some flag indicating that workers are doing something){
                condition.await();
            }
            // this should be processed only after both worker1 and worker2 called signalAll
         }
   }

这样的事情可能发生吗?让线程等待到多个调用notifyAll()的源,而不是只等待一次。我希望我把这个问题弄清楚了。

多谢帮忙!

共有2个答案

端木淇
2023-03-14

使用两个条件并让处理线程等待这两个条件。

华飞驰
2023-03-14

您可以使用CountDownLatch来实现该行为。

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

  • 我正在创建一个简单的web代理应用程序使用Java。基本上,main方法创建一个RequestReceiver对象,该对象具有侦听web浏览器http请求的ServerSocket。从ServerSocket.Accept()返回的套接字创建一个新的连接对象,并将其放入线程池中。

  • 我想做一个小练习来习惯等待/通知。我想做的是简单地启动一个线程,然后用等待让它进入睡眠状态,用通知唤醒它,多次。 我的代码是: 我希望这会是这样 相反,这样做: 所以。。。通知似乎没有唤醒打印机线程? 这不应该是一个死锁,因为通过等待,我释放了所有的锁,所以主服务器不应该有任何对打印机的锁,打印机应该能够唤醒并打印。 我做错了什么?

  • 我有一个用于读写器的环形缓冲区。我跟踪环形缓冲区中的数字if条目,不允许覆盖尚未读取的条目。我使用std::condition\u variable wait()和notify\u one()来同步读写器。读卡器的基本条件是 这一切似乎都奏效了,但有一件事我不明白。当读写器调用notify\u one()时,不会导致上下文切换。我读过并理解它是这样工作的。然而,在写入程序写入一个条目以填充缓冲区的

  • 本文向大家介绍怎么唤醒被阻塞的socket线程?相关面试题,主要包含被问及怎么唤醒被阻塞的socket线程?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 给阻塞时候缺少的资源