我看到的代码片段在这个问题 ,我无法理解(最可能是由于我在这方面的初学者)。 这个问题谈到“一个明显的竞争条件,其中有时制片人将完成,它的信号,并ConsumerWorkers将停止之前在队列中消耗的一切。”
在我的理解,“isRunning”将在消费者设置后,方可生产商决定不在队列中不再添加项目。 所以,如果一个消费者线程看到isRunning为false,然后看到inputQueue是空的,然后有更多的获取添加到在未来的队列就都没有可能。 Obviosuly,我错了,失去了一些东西,因为没有人谁回答这个问题说问题的情况下是不可能的。 那么,能不能有人请解释什么事件序列导致这种竞争情况?
事实上,我看到别的一个问题。 对于恩,如果多个消费者线程看到生产者isRunning,并说出了排队一个项目,多个线程可以进入封锁“接受”。 如果制片人现在结束了,当一个线程将出来的“花”,另一个线程被阻塞在“拿”永远。 有趣的是,没有谁回答提问时指出这个问题为好。 所以,我的这种理解也可能有问题?!
我没有想在这个问题有其添加为评论,因为这是一个老问题,我怀疑可能永远不会得到回答! 我复制/配股代码从这个问题在这里为快速参考。
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 producer is still running or as
//long as the queue is not empty:
while(isRunning || !inputQueue.isEmpty()) {
System.out.println("Consumer "+Thread.currentThread().getName()+" START");
try {
Object queueElement = inputQueue.take();
//process queueElement
} catch (Exception e) {
e.printStackTrace();
}
}
}
//this is used to signal from the main thread that he producer has finished adding stuff to the queue
public void setRunning(boolean isRunning) {
this.isRunning = isRunning;
}