Давайте предположим, что у меня есть поток, который использует объекты, произведенные другим потоком. Его метод выполнения следующим образом, при этом inQueue является BlockingQueue
boolean shutdown = false;
while (!shutdown) {
try {
WorkItem w = inQueue.take();
w.consume();
} catch (InterruptedException e) {
shutdown = true;
}
}
Кроме того, другой поток будет сигнализировать, что больше нет объектов работы путем прерывания этого рабочего потока. Возьмет (), выдают прерванное исключение, если оно не должно блокироваться для получения следующего объекта работы. т.е. если производитель предупреждает, что это сделано, заполнив очередь заданий, действительно ли возможно случайно оставить некоторые объекты в inQueue или пропустить прерывание?
Хороший способ сигнализировать об окончании блокировки очереди - подать в очередь "ядовитое" значение, указывающее на то, что произошло выключение. Это гарантирует, что ожидаемое поведение очереди будет соблюдено. Вызов 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
}
}
Согласно javadoc, метод take()
, в случае прерывания во время ожидания, будет сброшен interruptedException
.
Пакет java.concurrency.utils был разработан и реализован одними из лучших умов в области параллельного программирования. Кроме того, прерывание потоков как средство их прерывания однозначно одобрено в их книге "Java Concurrency in Practice". Поэтому я был бы крайне удивлен, если бы какие-либо элементы остались в очереди из-за прерывания
.