Мне интересно, почему это вызовет бесконечный цикл. Что означает «Он не может восстановить статус прерывания раньше».
Так обычно вы восстанавливаете состояние прерывания немедленно в catch
блоке. Однако, если бы это было сделано в этом случае, а затем оно пересекалось и снова вызывало take()
, это вызвало бы другой выброс InterruptedException
и бесконечный цикл.
Для меня вопрос с кодом заключается в том, почему, если поток был прерван, код замыкается и снова вызывает take()
. Как правило, мы в цикле, который что-то вроде:
while (!Thread.currentThread().isInterrupted()) {
...
}
Может автор кода запутанного паразитных пробуждений с паразитными прерываниями? Я не думаю, что последнее на самом деле происходит. Конечно, происходят побочные пробуждения, но они обрабатываются внутри методом queue.take()
.
Обычно мы восстановим статус прерывания потока что-то вроде следующего кода:
try {
queue.take();
} catch (InterruptedException ie) {
// because catching InterruptedException clears the thread interrupt bit,
// we immediately re-interrupt the current thread.
Thread.currentThread().interrupt();
// handle the interrupt here by quitting or returning or ...
}
@Gray: Я извиняюсь за это. –