Tag: 生产者消费者

阻塞队列和multithreading的消费者,如何知道何时停止

我有一个单线程生产者创build一些任务对象,然后将其添加到一个ArrayBlockingQueue (这是固定的大小)。 我也开始一个multithreading的消费者。 这是build立一个固定的线程池( Executors.newFixedThreadPool(threadCount); )。 然后,我将一些ConsumerWorker实例提交给此ThreadPool,每个ConsumerWorker都具有对上述ArrayBlockingQueue实例的引用。 每个这样的工作人员将在队列中做一个take()处理任务。 我的问题是,有什么最好的方式让工人知道什么时候不会有任何工作要做。 换句话说,我怎么告诉工人,生产者已经join队列,从这一刻起,每个工人应该停下来,看看队列是空的。 我现在得到的是一个安装程序,我的Producer用一个callback来初始化,当他完成它的工作(添加队列的东西)时触发callback。 我还保留了我创build并提交给ThreadPool的所有ConsumerWorkers的列表。 当生产者callback告诉我生产者完成时,我可以告诉每个工人。 在这一点上,他们应该简单地继续检查队列是否为空,当它变为空时,它们应该停止,从而允许我正常closures下ExecutorService线程池。 这是这样的 public class ConsumerWorker implements Runnable{ private BlockingQueue<Produced> inputQueue; private volatile boolean isRunning = true; public ConsumerWorker(BlockingQueue<Produced> inputQueue) { this.inputQueue = inputQueue; } @Override public void run() { //worker loop keeps taking en element from the queue as long as the […]