Есть класс Clock, наследуемый от Thread с методом run().
public static class Clock extends Thread {
private int seconds;
@Override
public void run() {
try {
while (!currentThread().isInterrupted()) {
Thread.sleep(1000);
seconds++;
System.out.println(seconds);
}
} catch (InterruptedException e) {
System.out.println("Конец отсчета.");
}
}
}
Метод main(), где запускаем поток, ждем 5 секунд, потом вызывается метод clock.interrupt().
public static void main(String[] args) throws InterruptedException {
Clock clock = new Clock();
clock.start();
Thread.sleep(5000);
clock.interrupt();
}
Вопрос:
Почему после вызова метода clock.interrupt() отрабатывает catch. Ведь по идее !currentThread().isInterrupted() должен стать false, и перестать работать цикл, следовательно поток(нить) clock должен закончить свою работу выполнив только то, что в try.
Потому что метод Thread.sleep(long) выбрасывает исключение в случае если поток был прерван(был вызван метод Thread.interrupt()). Про это можно почитать в офф. документации.
InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.
Условие while (!currentThread().isInterrupted()) может отработать только в том случае, если вы вызовете clock.interrupt() в течение этих двух операций:
seconds++;
System.out.println(seconds);
Если же clock.interrupt() будет вызван в течение работы Thread.sleep(1000); (что вероятно почти на 100%) исключение будет выброшено мгновенно и перехвачено в catch (InterruptedException e)
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости