Этот вопрос взят из примера из книги «Параллельность Java на практике» Брайана Гетца, глава 7, 7.1.3. Ответ на прерывание (стр. 143 - 144) В книге говорится о книгеВызов методов прерывистой блокировки в цикле
Действия, которые не поддерживают отмену, но продолжают прерывать методы блокировки, должны будут вызвать их в цикле, повторив при обнаружении прерывания. В этом случае они должны сохранять статус прерывания локально и восстанавливать его непосредственно перед возвратом, как показано в примере ниже, а не сразу после обнаружения InterruptedException. Установка прерванное состояние слишком ealry может привести к бесконечному циклу, так как большинство прерываемые методов блокировки проверить статус прерывания на входе и бросить InterruptedException немедленно, если он установлен ......
public Task getNextTask(BlockingQueue<Task> queue) {
boolean interrupted = false;
try {
while (true) {
try {
return queue.take();
} catch (InterruptedException e) {
interrrupted = true;
}
}
} finally {
if (interrupted)
Thread.currentThread().interrupt();
}
}
Мой вопрос зачем нужен цикл?
Также если queue.take() выбрасывает interruptedException, то я предполагаю, что флаг прерывания установлен на текущий поток правильно? Затем следующий вызов queue.take() снова вызовет interruptedException, поскольку предыдущее прерывание на текущем потоке не очищается, и это не вызовет бесконечный цикл?