【问题标题】:Java consumer thread to wait for all producer threads to finishJava消费者线程等待所有生产者线程完成
【发布时间】:2021-02-16 14:28:37
【问题描述】:

我有一个生产者-消费者模式的多线程任务。可能有许多生产者和一个消费者。我使用 ArrayBlockingQueue 作为共享资源。

Producer 类中的run() 方法:

public void run() {
         for (Order order : orderList) {
             try {
                 queue.put(order);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
         log.info("{} has placed all orders", Thread.currentThread().getName());
     }

Consumer 类中的 run() 方法:

     public void run() {
         while (!queue.isEmpty()) {
             try {
                 Order order = queue.take();
                 checkOrder(order);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
         log.info("All orders has been checked");
     }

ma​​in() 方法:

// creating N producers
         for (int i = 0; i < PRODUCERS_NUM; i++) {
             Producer producer = new Producer(orderQueue, orderList);
             new Thread(producer , "Producer " + i).start();
         }
 
         Thread consumerThread = new Thread(new Consumer(orderQueue, limitList), "Consumer");
         consumerThread.start();
         consumerThread.join();

**Printing results **

现在,当队列为空时,我有消费者结束条件。但是可能会有一段时间队列变空,但一些生产者线程仍在工作。所以我只需要在所有生产者线程都完成后才能完成消费者线程(但事先不知道它们的数量)。

编码的正确方法是什么?

【问题讨论】:

    标签: java multithreading producer-consumer


    【解决方案1】:

    由于您有固定数量的生产者,我建议您在开始时设置一个生产者数量的计数器。每个生产者在完成时递减计数器,而消费者仅在达到零时终止。对于计数器,您需要使用Atomic Integer

    【讨论】:

    • 为什么不用CountDownLatch?
    • 我试过了,但在我看来不是很干净,因为我需要为生产者和消费者提供一个额外的参数(计数器)。所以我想寻找更好的解决方案。
    • @codeflush.dev 我不认为 CountDownLatch 是一种解决方案,因为消费者希望在计数器大于 0 时取得进展。可以将 CountDownLatch 与 getCount 一起使用而不是 await 但那就是与原子整数相同。
    • @VitalyKolesnikov 无论你做什么,你都需要一个机制让生产者与消费者沟通它尚未完成。这将是已共享状态(队列)的一部分或新的东西。将关注点分开并将其作为单独的东西似乎更合理。我想您可以使用此计数器扩展队列以创建 CountingQueue 或类似的,其中生产者在开始时向上计数,在结束时向下计数。
    • 对不起,我应该指出,您需要注意消费者在生产者之前开始的竞争条件,例如您可能希望在创建生产者时在主线程中进行计数,而不是在生产者线程中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多