问题描述
我有一个使用生产者-消费者模式的多线程任务。可能有许多生产者和一个消费者。我将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。