interrupted() 和 isInterrupted() 的區別
阿新 • • 發佈:2018-12-18
Thread 類中提供了兩種方法用來判斷執行緒的狀態是不是停止的。就是我們今天的兩位主人公 interrupted() 和 isInterrupted() 。
interrupted()
官方解釋:測試當前執行緒是否已經中斷,當前執行緒是指執行 this.interrupted() 方法的執行緒 。
public class t12 { public static void main(String[] args) { try { MyThread12 thread = new MyThread12(); thread.start(); Thread.sleep(500); thread.interrupt(); System.out.println("是否終止1? =" + thread.interrupted()); System.out.println("是否終止2? =" + thread.interrupted()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("-------------end-------------"); } } class MyThread12 extends Thread { public void run() { for (int i = 0; i < 50000; i++) { System.out.println("i = " + i); } } }
程式執行結束後,結果如上圖所示,thread 執行緒並沒有停止,而且呼叫 thread.interrupted() 結果是兩個 false 表示執行緒一直在執行過程中,為什麼會出現這種結果呢?
讓我們再來自己看看官方解釋,這次請著重閱讀我標紅的文字:當前執行緒是指執行 this.interrupted() 方法的執行緒 。也就是說,當前執行緒並不是 thread,並不是因為 thread 呼叫了 interrupted() 方法就是當前執行緒。當前執行緒一直是 main 執行緒,它從未中斷過,所以列印結果就是兩個 false。
那麼如何讓 main 執行緒產生中斷效果呢?
public class t13 { public static void main(String[] args) { Thread.currentThread().interrupt(); System.out.println("是否終止1? =" + Thread.interrupted()); System.out.println("是否終止2? =" + Thread.interrupted()); System.out.println("----------end-----------"); } }
從上述結果中可以看出,方法 interrupted() 的確判斷出當前執行緒是否已經停止,但是為什麼第 2 個布林值是 false 呢?讓我們重新閱讀一次文件。
你看,文件中說的很詳細,interrupted() 方法具有清除狀態的功能,所以第二次的時候返回值是 false。
isInterrupted()
從宣告中可以看出來 isInterrupted() 方法並不是 static 的。並且 isInterrupted() 方法並沒有清除狀態的功能。
public class t14 { public static void main(String[] args) { try { MyThread14 thread = new MyThread14(); thread.start(); Thread.sleep(1000); //此方法代表 讓當前執行緒休眠 1 秒,即表示使 main執行緒休眠 1秒 thread.interrupt(); System.out.println("是否終止1? =" + thread.isInterrupted()); System.out.println("是否終止2? =" + thread.isInterrupted()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("----------end-----------"); } } class MyThread14 extends Thread { public void run() { for (int i = 0; i < 500000; i++) { System.out.println("i = " + i); } } }
總結
1. interrupted():測試 當前執行緒 是否已經是中斷狀態,執行後具有清除狀態功能。
2. isInterrupted():測試執行緒 Thread 物件 是否已經是中斷狀態,但不清楚狀態標誌。