2017-02-23 6 views
0

Javaスレッドが終了した時点でinterruptedかどうかを調べようとしています。これまでのところ、答えは右run()の終わりをオフに落ちる前に、我々はThread.currentThread().isInterrupted()trueで見ることができます終了したJavaスレッドの中断状態を取得する方法は?

...「ノー」であるように思われます。

しかしjoin()がターゲットスレッドをINGの後、私たちは常に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-c​​lear-the-thread-interrupt-flag –

答えて

4

あなたは間違っているスレッドの状態をチェックしている:あなたが実行されるため

Thread.currentThread().isInterrupted() 

は、メインスレッドの状態ですそれは直接testメソッド内にあります。あなたはこの1つを中断しなかった、あなたはaを中断した。したがって、aのステータスを確認してください:

a.isInterrupted() 
+0

typoを修正した後(感謝!)、私たちはまだ同じ問題を抱えています。 'a.isInterrupted()'はまだ結合の後で偽です!?!?! – DouglasDD

関連する問題