Я экспериментировал с прерываниями в java и наблюдал, что если я прерываю поток и не сбрасываю его статус прерывания, когда состояние потока изменено с RUNNABLE до TERMINATED, прерванная переменная получает сброс (прерывание становится ложным)Ошибка потока Java-потоков
Main.java
public class Main {
public static void main(String[] args) {
try {
t1 t1 = new t1();
t1.start();
Thread.sleep(10);
t1.interrupt();
System.out.println("t1.isInterrupted: " + t1.isInterrupted() + " t1.state: " + t1.getState());
Thread.sleep(20);
System.out.println("t1.isInterrupted: " + t1.isInterrupted() + " t1.state: " + t1.getState());
} catch (Exception exc) {
System.out.println("Exception: " + exc);
}
}
}
t1.java
public class t1 extends Thread {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Processing");
}
System.out.println("Execution completed - interrupt status: " + Thread.currentThread().isInterrupted());
}
}
Выход Main.java (Centos 7 64 бит, Java 1.8.0_66-b17)
- Обработка
Обработка
Обработка
t1.isInterrupted : true t1.state: RUNNABLE
Execution co mpleted - прерывания статус: истинный
t1.isInterrupted: ложные t1.state: ОТМЕНЯЛОСЬ
Мой вопрос в том, кто или что устанавливает этот флаг обратно в ложь и почему? Класс Thread имеет закрытый метод exit, который устанавливает некоторые внутренние переменные в null, но я не мог найти ничего, что сбрасывает прерванный флаг. Если кто-то может пролить некоторый свет на вопрос я буду благодарен ...
PS: вот ссылка на GIST
«... кто или что возвращает этот флаг к ложному и почему?» Какое тебе дело? Кто-то принял решение об осуществлении, так оно и есть. – ControlAltDel
Посмотрите на https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html – mkabanen
Этот поток больше не жив, и поэтому прерванный статус будет ложным. –