2017-02-23 46 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

它似乎是清除状态的“加入”调用:http://ideone.com/2s0x6H。尽管如此,我无法看到该行为记录在哪里。 –

+1

投票重新开放,但我立即重新作为这个骗局:http://stackoverflow.com/questions/10401947/methods-that-c​​lear-the-thread-interrupt-flag –

回答

4

你检查错误的线程的状态:

Thread.currentThread().isInterrupted() 

是主线程的状态,因为你执行它直接在test方法内。你没有打断这个,你打断了a。因此,请检查a的状态:

a.isInterrupted() 
+0

修复了错字(谢谢!)我们仍然有同样的问题。 'a.isInterrupted()'在加入之后仍然是错误!!!?! – DouglasDD