Почему interrupt() не изменил флаг?

154
07 ноября 2018, 15:00

Тестовый код:

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 
Answer 1

Метод 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");
        }
    }
READ ALSO
Как создать массив с буквами кириллицы в Java?

Как создать массив с буквами кириллицы в Java?

При создании массива с русскими символами компилятор выдаёт такую ошибку(смизображение)

188
Java EE Glassfish ProgrammaticLogin. “No LoginModules configured for default”

Java EE Glassfish ProgrammaticLogin. “No LoginModules configured for default”

Доброго всем времени суток! Столкнулся с ошибкой "No LoginModules configured for default" при попытке вызвать @Remote EJB метод с проверкой роли пользователяАвторизации...

187
Регулярка для номера телефона

Регулярка для номера телефона

Всем привет Помогите написать регулярку для номера телефона С такой вот маской

187
Konvajs. Как получить объект при нажатии?

Konvajs. Как получить объект при нажатии?

Работаю с konva У меня есть массив квадратов такого типа

204