Если поток прерывается внутри Object.wait()
или Thread.join()
, он выдает InterruptedException
, который сбрасывает состояние прерывания потока. I. e., Если у меня такой петли внутри a Runnable.run()
:
while (!this._workerThread.isInterrupted()) {
// do something
try {
synchronized (this) {
this.wait(this._waitPeriod);
}
} catch (InterruptedException e) {
if (!this._isStopping()) {
this._handleFault(e);
}
}
}
поток будет продолжать работать после вызова interrupt()
. Это означает, что я должен явно вырваться из цикла, проверив мой собственный флаг остановки в состоянии цикла, перестроил исключение или добавил break
.
Теперь это не совсем проблема, так как это поведение хорошо документировано и не мешает мне делать что-либо так, как я хочу. Тем не менее, я, похоже, не понимаю концепции, лежащей в основе этого: почему поток не считается прерванным после того, как исключение было выброшено? Подобное поведение также возникает, если вы получаете прерванный статус с interrupted()
вместо isInterrupted()
, тогда тоже поток будет только прерываться один раз.
Я делаю что-то необычное здесь? Например, чаще всего ловить InterruptedException
вне цикла?
(Несмотря на то, что я не совсем новичок, я пометил этого "новичка", потому что для меня это очень простой вопрос, глядя на него.)