При каких условиях BlockingQueue.take выдаст прерванное исключение?

Давайте предположим, что у меня есть поток, который использует объекты, произведенные другим потоком. Его метод выполнения следующим образом, при этом inQueue является BlockingQueue

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

Кроме того, другой поток будет сигнализировать, что больше нет объектов работы путем прерывания этого рабочего потока. Возьмет (), выдают прерванное исключение, если оно не должно блокироваться для получения следующего объекта работы. т.е. если производитель предупреждает, что это сделано, заполнив очередь заданий, действительно ли возможно случайно оставить некоторые объекты в inQueue или пропустить прерывание?

8
задан Ryan 24 December 2009 в 13:34
поделиться

3 ответа

Хороший способ сигнализировать об окончании блокировки очереди - подать в очередь "ядовитое" значение, указывающее на то, что произошло выключение. Это гарантирует, что ожидаемое поведение очереди будет соблюдено. Вызов 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
    }
}
4
ответ дан 5 December 2019 в 19:00
поделиться

Согласно javadoc, метод take(), в случае прерывания во время ожидания, будет сброшен interruptedException.

.
3
ответ дан 5 December 2019 в 19:00
поделиться

Пакет java.concurrency.utils был разработан и реализован одними из лучших умов в области параллельного программирования. Кроме того, прерывание потоков как средство их прерывания однозначно одобрено в их книге "Java Concurrency in Practice". Поэтому я был бы крайне удивлен, если бы какие-либо элементы остались в очереди из-за прерывания

.
-1
ответ дан 5 December 2019 в 19:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: