【问题标题】:Java multithreading: a good way to notify the consumer threads that all the producer threads have finished?Java多线程:通知消费者线程所有生产者线程都已完成的好方法?
【发布时间】:2017-09-27 10:40:57
【问题描述】:

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

【问题讨论】:

    标签: java multithreading


    【解决方案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{
              ....
            }
         }
       }
     }  
    

    【讨论】:

    • 毒丸不是必须由每个消费者处理,而不仅仅是一个吗?
    • 如果您使用单个队列共享,则允许一个消费者,否则您必须广播到不同的队列。
    • 是的,但问题意味着多个生产者和多个消费者正在使用一个队列。你的想法没问题,但 OP 可能需要做一些额外的工作才能得到他想要的东西
    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多