Если поток прерывается внутри 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 вне цикла?
(Несмотря на то, что я не совсем новичок, я пометил этого "новичка", потому что для меня это очень простой вопрос, глядя на него.)