Тестовый код:
public class Test {
public static void main(String[] args) {
System.out.println("Start T1");
Thread t = new T1();
t.start();
try {
Thread.sleep(5000);
} catch (InterruptedException ie) { }
t.interrupt();
System.out.println("Of T1");
}
public static class T1 extends Thread {
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException ie) {
System.out.println(this.isInterrupted());
System.out.println("T1");
}
}
}
}
Вывод
Start T1
Of T1
false -> почему так ?
T1
Метод sleep() уже сам по себе "прерываемый". Если метод sleep() вызывается, когда установлено состояние прерывания (с помощью interrupt()), поток исполнения
не переходит в состояние ожидания. Вместо этого он очищает свое состояние (!) и генерирует исключение типа InterruptedException. Поэтому, все что вам нужно сделать, это еще раз руками установить флаг прерывания.
В вашем примере это будет не очень наглядно, но это общий принцип по отношению к методам типа sleep(), которые блокируют поток и кидаются исключениями InterruptedException. Вот таким должен быть ваш run() (можно без this):
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException ie) {
this.interrupt();
System.out.println(this.isInterrupted());
System.out.println("T1");
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей