Java使用者线程等待所有生产者线程完成

问题描述

我有一个使用生产者-消费者模式的多线程任务。可能有许多生产者和一个消费者。我将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());
>     }
消费者类中的

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

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