2017-02-23 11 views
0

Java 스레드가 interrupted인지 여부를 판별하려고 시도하고 있습니다. 지금까지 대답은 "아니오"인 것 같습니다 ...종료 된 Java 스레드의 중단 상태를 얻는 방법은 무엇입니까?

run()의 끝에서 떨어지기 직전에 Thread.currentThread().isInterrupted()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의 상태를 확인하십시오.

a.isInterrupted() 
+0

오타를 수정 한 후 (감사합니다!) 우리는 여전히 같은 문제가 있습니다. 'a.isInterrupted()'는 조인 후에도 여전히 거짓입니다!?!?! – DouglasDD