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.
我有一个采用生产者-消费者模式的多线程任务。可能有很多生产者和一个消费者。我使用 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.