Java 消费者线程等待所有生产者线程完成

Java consumer thread to wait for all producer threads to finish

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

运行() 生产者中的方法 class:

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());
     }

运行() 消费者中的方法 class:

     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");
     }

main() 方法:

// 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 **

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

正确的编码方式是什么?

由于您有固定数量的生产者,我建议在开始时设置一个计数器,其中包含生产者的数量。每个生产者在完成时递减计数器,而消费者只有在它达到零时才终止。对于计数器,您可能希望使用 Atomic Integer.