让我们假设我有一个消耗另一个线程产生的物品的线程。它的运行方法如下,与INQUEUE是一个BlockingQueue的BlockingQueue.take在什么情况下会抛出异常中断?
boolean shutdown = false;
while (!shutdown) {
try {
WorkItem w = inQueue.take();
w.consume();
} catch (InterruptedException e) {
shutdown = true;
}
}
此外,不同的线程将发出信号,有通过中断这个正在运行的线程没有更多的工作项目。如果不需要阻塞以检索下一个工作项,将采取()抛出一个被中断的异常。即如果生产者发出信号表示已完成填充工作队列,是否可能意外地将一些项目留在队列中或错过中断?
你已经差不多了。而不是让* consumer *在中断时将“shutdown”设置为true,而是让* producer *在中断消费者之前将其设置为true。注意这个A)通过避免一个前哨值(“毒丸”)来保持漂亮,B)正确地处理虚假唤醒,C)更通用,因为无论队列是否为空,你都可以故意停止消费者。 – user359996 2012-08-09 20:59:56