2014-01-06 5 views
0

Ну, я читала статью, участвующих в прерывании в java.Now я не понимаю, образец очень хорошо, как показано ниже: enter image description hereПочему это вызовет бесконечный цикл здесь

мне интересно, почему это вызовет бесконечный цикл. Что означает «Он не может восстановить статус прерывания раньше». Цените любую помощь. Спасибо.

+0

@Gray: Я извиняюсь за это. –

ответ

1

Мне интересно, почему это вызовет бесконечный цикл. Что означает «Он не может восстановить статус прерывания раньше».

Так обычно вы восстанавливаете состояние прерывания немедленно в 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 ... 
} 
+0

Я думаю, если это так, как только вы вызываете Thread.currentThread() .interrupt() немедленно в предложении catch, это вызовет queue.take() снова вызовет InterruptedException, так что будет бесконечный цикл. Я прав? –

+0

@tuanlong Да, это, вероятно, просто быстрый путь из 'take()' и сразу бросает исключение. Если вы проигнорируете его и не сбросите флаг, он будет продолжаться снова и снова. –

+0

@JohnVint: Спасибо. –

1

Бесконечный цикл может произойти здесь, если take() throws InterruptedException, как говорится в сайте.

Это потому, что выражение оценивается до его возвращения, поэтому, если его оценка выдает исключение, вы мгновенно переходите к блоку catch, пропуская return.

+1

Если 'queue' был пустым, было бы выбрано' NullPointerException', и поскольку оно не поймано, оно просто пузырится. Я не думаю, что в этом случае это будет бесконечно. – matt

+0

Вы правы, мои глаза изо всех сил пытаются прочитать этот крошечный текст. –

+1

Мне очень жаль, что я не заметил, что эта картина слишком мала, чтобы ее можно было прочитать. Я обращу внимание на это в следующий раз. Большое вам спасибо. –

Смежные вопросы