Выбор ответа Senior Исключения обновлено
Как обработать InterruptedException
Вопрос
Метод не может объявить throws InterruptedException. Как правильно обработать его при вызове Thread.sleep?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Поймать и восстановить флаг через Thread.currentThread().interrupt(). Когда бросается InterruptedException, флаг прерывания уже сброшен.
Варианты ответа
- Поймать и проигнорировать: прерывание уже сработало, флаг больше не нужен
- Поймать и вызвать
Thread.interrupted(), чтобы снова выставить флаг - Поймать и восстановить флаг через
Thread.currentThread().interrupt()правильный ответ - Поймать
Exceptionцеликом, залогировать и продолжить ожидание
Разбор
Когда бросается InterruptedException, флаг прерывания уже сброшен. Если его проглотить, код выше по стеку (например, пул потоков при shutdownNow) не узнает о запросе на остановку. Поэтому флаг восстанавливают через interrupt(). Thread.interrupted() наоборот читает и сбрасывает флаг. Ловля Exception смешивает прерывание с ошибками и тоже теряет флаг.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.