2017-06-01 50 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(「interrupt status:」+ ct.getState());

結果總是一樣的:

開始中斷 接收中斷信號 結果:

雖然我離開它的代碼,結果是不可重複-1。該結果可能是:

中斷狀態:RUNNABLE 開始中斷 結果:-1 接收中斷信號

或者:

中斷狀態:RUNNABLE 開始中斷 結果:0 接收中斷信號

想不明原因,請幫忙。謝謝。

回答

1

你的實現有一個競爭條件,這只是一個巧合,你有可重複的結果,註釋System.out.println("interrupt status: " + ct.getState());行。問題是線程並行運行,並且不能保證在主線程中在System.out.println("result: " + ct.getResult());之前執行CounterThread中的語句result = -1;

要使結果可重複的,你需要等待,直到執行以下塊:

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

您可以通過打印結果之前加入join()調用實現它。

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

在這種情況下,主線程將等到CounterThread完成並打印結果。

+0

感謝兄弟,這對我來說非常清楚。 – awkejiang