2014-12-15 2 views
12

Я немного путаюсь с поведением thread.isInterrupted в приведенной ниже программе.Различное поведение при вызове thread.isInterrupted и печать результата

public class ThreadPractice { 

    public static void main(String args[]) throws InterruptedException { 

     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        System.out.println("Starting thread..." + Thread.currentThread().getName()); 
        Thread.sleep(10000); 
        System.out.println("Waking up"); 
       }catch(InterruptedException e){ 
        System.out.println("Thread is interrupted!!!"); 
        Thread.currentThread().interrupt(); 
       } 
      } 
     }); 

     t.start(); 
     Thread.sleep(2000); 
     t.interrupt(); 
     //System.out.println(!t.isInterrupted()); 
     while(!t.isInterrupted()){ 
      System.out.println("Current thread not interrupted!!!"); 
     } 
    } 
} 

При выполнении вышеуказанной программы как таковой, он печатает,

Starting thread...Thread-0 
Thread is interrupted!!! 

Но когда я раскомментировать System.out заявление для печати статуса прерывания, он работает в печати бесконечного цикла, «Текущий поток не прерывается "

Я не могу точно определить, что именно делает разница System.out.

ответ

5

Обратите внимание, что я не всегда получаю бесконечный цикл.

Я подозреваю, что это связано с чередованием операций. Это помогает также проверить, жив ли нить:

System.out.println("Current thread not interrupted!!! Alive? " + t.isAlive()); 

Если нить не живая, ее прерванный статус является ложным.

я получаю выход, как:

Начиная нить ... Резьбонарезной 0
Тема прерывается !!!
Текущая нить не прерывается !!! В живых? true
Текущая нить не прерывается !!! В живых? ложные
[бесконечный цикл]

Я предполагаю, что первый цикл видит поток не прерывается, потому что InterruptedException снял флаг - то сбросить флаг с interrupt() в методе run() и нить может закончить и не живой.
Следующая проверка цикла видит, что она не жива, и вы начинаете бесконечный цикл.


Интересным вариантом может быть получен путем добавления:

System.out.println("Exiting Thread!!!"); 

В конце метода run() - он обеспечивает задержку достаточно долго для условия цикла должны быть проверены между временем прерванный флага сбрасывается и время, в течение которого нить умирает.

-1

В соответствии с Java-программой JVM завершится, как только все не-демона будут завершены.

Если вы не звонили t.interrupt(), то дочерняя тема будет жива. Итак, если вы проверяете цикл t.isInterrupted(), он возвращает true. Итак, перерыв цикла.

Если вы вызываете t.interrupt() при выполнении этой операции, дочерний поток будет прерван. Поэтому, если вы проверяете цикл t.isInterrupted(), он возвращает false. Потому что согласно Java Doc

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

в то время (правда) {}

Так петля никогда не ломаются.

+0

это неправильное, isInterrupted не очищает флаг. –

+0

Да. Он очистит флаг –

+1

@SivaKumar. Вы смешиваете 'прерванный()' с 'isInterrupted()'. Последний не очищает флаг. – assylias