在什么条件下BlockingQueue.take会中断异常?

Rya*_*yan 8 java concurrency interrupt interrupted-exception

让我们假设我有一个消耗另一个线程产生的项的线程.其运行方法如下,inQueue为BlockingQueue

boolean shutdown = false;
while (!shutdown) {
    try {
        WorkItem w = inQueue.take();
        w.consume();
    } catch (InterruptedException e) { 
        shutdown = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,一个不同的线程将通过中断此运行的线程来发出没有​​更多工作项的信号.如果不需要阻塞来检索下一个工作项,take()会抛出一个中断的异常.即如果生产者发出信号说它已完成填充工作队列,是否可能意外地将一些物品留在inQueue中或错过中断?

Kev*_*Day 5

发出阻塞队列终止信号的一个好方法是向队列提交一个“毒药”值,表明发生了关闭。这确保了队列的预期行为得到遵守。如果您关心清除队列,则调用 Thread.interupt() 可能不是一个好主意。

提供一些代码:

boolean shutdown = false;
while (!shutdown) {
    try {
        WorkItem w = inQueue.take();
        if (w == QUEUE_IS_DEAD)
          shutdown = true;
        else
          w.consume();
    } catch (InterruptedException e) { 
        // possibly submit QUEUE_IS_DEAD to the queue
    }
}
Run Code Online (Sandbox Code Playgroud)