Java多线程:一种通知消费者线程所有生产者线程都已完成的好方法?

时间:2017-04-29 11:16:01

标签: java multithreading

我正在研究一个相当简单的生产者/消费者场景:我有一些线程将数据传递给监视器,其他线程等待监视器中的数据,将其删除并将数据传递给另一个监视器。在某一时刻,生产者们已经将他们的最后数据传送到显示器。在消费者使用了监视器中的最后一个数据之后,需要告知他们不要等待来自监视器的更多数据。为了使其按预期运行,消费者线程需要在最后一个生产者线程产生最后一位数据时得到通知,并且没有更多数据到期。我确信有多种方法可以做到这一点。截至目前,监视器计算活动生成器线程的数量,并且当生产者线程完成时,它会告诉监视器。虽然对此更优雅的方法是什么,但我非常好奇。

1 个答案:

答案 0 :(得分:1)

一个简单的解决方案是让每个生产者发送一个poison pill消费者将保留到目前为止收到的毒丸的数量,并将其与生产者的数量进行比较。

 class Consumer{
   final int numOfProducers;
   int poisonPillsReceived;

   void run(){
     while(true){
        Object obj = queue.poll();
        if(isPoisonPill(obj)){
          poisonPillsReceived++;
        }

        if(numOfProducers == poisonPillsReceived){
         break;
        }else{
          ....
        }
     }
   }
 }