2017-06-01 13 views
0
public class ThreadTest { 

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

     CounterThread ct = new CounterThread(); 
     ct.setDaemon(true); 
     ct.start(); 

     ct.join(2); 

     System.out.println("interrupt status: " + ct.getState()); // key sentence 
     if (ct.isAlive()) { 
      System.out.println("start interrupt"); 
      ct.interrupt(); 
     } 

     System.out.println("result: " + ct.getResult()); 

    } 
} 

class CounterThread extends Thread { 

    private int result; 

    public int getResult() { 
     return result; 
    } 

    public void run() { 
     for (int i = 0; i < 999999999; i++) { 
      if (i == 999999998) { 
       result = 5; 
       System.out.println("calculate finished"); 
      } 
      if (Thread.interrupted()) { 
       result = -1; 
       System.out.println("receive interrupt signal"); 
       return; 
      } 
     } 
    } 
} 

私は上記のコードを使用してJava割り込みメカニズムをテストします。私が印刷文をコメントアウトするとき結果がJavaのスレッド割り込みでは返されない

System.out.println( "割り込みステータス:" + ct.getState());

結果は常に同じです: 割り込み

スタートは、割り込み信号 結果受信:-1

を私はコードでそれを残しながら、結果が再現可能ではありません。結果は指定できます

割り込みステータス: 結果割り込みRUNNABLE 開始:-1 は

または割り込み信号を受信します。

割り込みステータス: 結果割り込みRUNNABLE スタート:0 割り込み信号を受け取ります

理由がわからない場合は、お手伝いください。ありがとう。

答えて

1

あなたの実装には競合条件があります。これは、コメントアウトされたSystem.out.println("interrupt status: " + ct.getState());行の繰り返し結果があったことだけです。問題はスレッドが並行して実行されていることで、result = -1;CounterThreadがメインスレッドのSystem.out.println("result: " + ct.getResult());より前に実行される保証はありません。

次のブロックが実行されるまで待つ必要があり、結果が再現可能にするには:

if (Thread.interrupted()) { 
    result = -1; 
    System.out.println("receive interrupt signal"); 
    return; 
} 

あなたは結果を印刷する前にjoin()コールを追加することによって、それを達成することができます。

ct.join(); 
System.out.println("result: " + ct.getResult()); 

その場合はメインスレッドはCounterThreadが終了するまで待機し、その結果を印刷します。

+0

おかげで、それは私にはとても分かります。 – awkejiang

関連する問題