Выбор ответа Senior Исключения обновлено

Как обработать InterruptedException

Вопрос

Метод не может объявить throws InterruptedException. Как правильно обработать его при вызове Thread.sleep?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Поймать и восстановить флаг через Thread.currentThread().interrupt(). Когда бросается InterruptedException, флаг прерывания уже сброшен.

Варианты ответа

  1. Поймать и проигнорировать: прерывание уже сработало, флаг больше не нужен
  2. Поймать и вызвать Thread.interrupted(), чтобы снова выставить флаг
  3. Поймать и восстановить флаг через Thread.currentThread().interrupt()правильный ответ
  4. Поймать Exception целиком, залогировать и продолжить ожидание

Разбор

Когда бросается InterruptedException, флаг прерывания уже сброшен. Если его проглотить, код выше по стеку (например, пул потоков при shutdownNow) не узнает о запросе на остановку. Поэтому флаг восстанавливают через interrupt(). Thread.interrupted() наоборот читает и сбрасывает флаг. Ловля Exception смешивает прерывание с ошибками и тоже теряет флаг.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.