2017-02-23 42 views
0

Я пытаюсь определить, был ли Java-поток interrupted или нет в момент его прекращения. Пока что ответ кажется «нет» ...Как получить прерванный статус завершенного Java-потока?

Сразу перед отходом от конца run() мы можем видеть Thread.currentThread().isInterrupted() is true.

Но после того, как join() ИНГОВ целевой нитки мы всегда получаем false:

import static org.junit.Assert.*; 
import org.junit.Test; 

public class ThreadDeadInterruptStateTest { 
    @Test public void test() { 
     Thread a = new Thread(new Runnable() { 
      @Override public void run() { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        Thread.currentThread().interrupt(); 
       } finally { 
        // 2x to show that check doesn't reset status 
        assertTrue("Interrupt status from a 1: ", // pass 
          Thread.currentThread().isInterrupted()); 
        assertTrue("Interrupt status from a 2: ", // pass 
          Thread.currentThread().isInterrupted()); 
       } 
      }}); 
     a.start(); 
     a.interrupt(); 
     try { 
      a.join(); 
      assertEquals("Thread state", a.getState(), 
        Thread.State.TERMINATED); // pass 
      assertTrue("Interrupt status after join: ", 
        a.isInterrupted()); // Still FAILs :-(
     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
     } 
    } 

    public static void main(String[] args) { 
     new ThreadDeadInterruptStateTest().test(); 
    } 
} 
+0

Исправлена ​​опечатка. Все еще разорены. – DouglasDD

+1

Кажется, что это вызов 'join', который очищает статус: http://ideone.com/2s0x6H. Однако я не вижу, где это поведение документировано. –

+1

Проголосовали за повторное открытие, но я немедленно закрою его в качестве обмана: http://stackoverflow.com/questions/10401947/methods-that-clear-the-thread-interrupt-flag –

ответ

4

Вы проверку состояния неверного потока:

Thread.currentThread().isInterrupted() 

является статусом основного потока, потому что вы выполняете он непосредственно внутри метода test. Вы не прервали это, вы прервали a. Итак, отметьте a 's статус:

+0

После исправления опечатки (спасибо!) у нас все еще есть та же проблема. 'a.isInterrupted()' по-прежнему остается ложным после соединения!?!?! – DouglasDD

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