我有一个阻塞队列,其中包含要执行的任务:
private final BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(20);
private final AtomicInteger isPoisingPill = new AtomicInteger(2); //two producers
还有一个消费者:
while (isPoisingPill.get() != 0) {
processExecutor.submit(this.kpiData.take()));
}
每个提供者在完成一项工作时,使: isPoisingPill.decrementAndGet();
但它并不适用于所有情况。有几次我们进入循环,生产者把PoisingPill置为false,程序挂了,因为操作take()在等待队列中的元素,而事实并非如此,因为生产者已经完成了。事实证明,药丸应该直接放在队列中,并且在循环中已经检查了是否相等。但是如果队列只包含Runnable对象,我应该在那里放什么?
还有一种情况是我有很多制作人。我们需要等待它们完成。
蓝山帝景
相关分类