Пост канала
- фото
Почему нельзя просто проигнорировать InterruptedException? Поток может ждать завершения задачи, блокировки или таймера. Другой поток вправе попросить его остановиться через interrupt. Например, worker делает паузу между проверками: while (!Thread.currentThread().isInterrupted()) { processNext(); Thread.sleep(1000); } Если вызвать interrupt во время sleep, метод выбросит InterruptedException. При этом флаг прерывания будет очищен. Это важный момент: после перехвата исключения простая проверка isInterrupted уже не увидит запрос на остановку. Такой обработчик теряет сигнал: try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("continue"); } Программа продолжит работу, будто отмены не было. Это особенно неприятно в пуле потоков и при остановке сервиса, вызывающий код считает, что попросил завершить задачу, а она выполняется дальше. Если метод может передать исключение выше, оставь его в сигнатуре: void pause() throws InterruptedException { Thread.sleep(1000); } Тогда решение об остановке примет вызывающий уровень. А если исключение приходится перехватить внутри Runnable или другого метода без throws, восстанови флаг и заверши работу: try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return; } Восстановленный флаг увидит внешний код, который проверяет состояние потока. Java Библиотека | Мы в Телеграм
Открыть в MAX- Просмотры
- 328
- ER
- —
- Реакции
- —