Тестовый код:
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");
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
При создании массива с русскими символами компилятор выдаёт такую ошибку(смизображение)
Доброго всем времени суток! Столкнулся с ошибкой "No LoginModules configured for default" при попытке вызвать @Remote EJB метод с проверкой роли пользователяАвторизации...
Всем привет Помогите написать регулярку для номера телефона С такой вот маской
Работаю с konva У меня есть массив квадратов такого типа