Поток может ждать завершения задачи, блокировки или таймера. Другой поток вправе попросить его остановиться через 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 Ready | #совет
