【发布时间】: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");
}
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 **
现在,当队列为空时,我有消费者结束条件。但是可能会有一段时间队列变空,但一些生产者线程仍在工作。所以我只需要在所有生产者线程都完成后才能完成消费者线程(但事先不知道它们的数量)。
编码的正确方法是什么?
【问题讨论】:
标签: java multithreading producer-consumer