2017-02-15 14 views
3

Я экспериментировал с прерываниями в 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

+0

«... кто или что возвращает этот флаг к ложному и почему?» Какое тебе дело? Кто-то принял решение об осуществлении, так оно и есть. – ControlAltDel

+0

Посмотрите на https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html – mkabanen

+2

Этот поток больше не жив, и поэтому прерванный статус будет ложным. –

ответ

0

Мой вопрос в том, кто или что устанавливает этот флаг обратно в ложь и почему?

Это известное поведение, когда поток завершается. Поскольку он больше не работает, состояние прерывания является ложным. Состояние прерывания истинно прямо перед завершением потока, но после его завершения установлено значение false.

Цитирует Thread.isInterrupted() javadocs:

прерывания волоска игнорировал, потому что поток не был жив в момент прерывания будет отражаться этим методом возвращения ложными.

 Смежные вопросы

  • Нет связанных вопросов^_^