1. 程式人生 > >interrupted() 和 isInterrupted() 的區別

interrupted() 和 isInterrupted() 的區別

Thread 類中提供了兩種方法用來判斷執行緒的狀態是不是停止的。就是我們今天的兩位主人公 interrupted() 和 isInterrupted() 。

interrupted()

image_1as4prvqmf31unj13asakincvm.png-21.5kB

官方解釋:測試當前執行緒是否已經中斷,當前執行緒是指執行 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);
        }
    }
}

image_1as4q86481d2u10uo1q3enfnagk1t.png-8.8kB

程式執行結束後,結果如上圖所示,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-----------");
    }
}

image_1as4qopti13m4lqqivjb3imf12a.png-7.6kB

從上述結果中可以看出,方法 interrupted() 的確判斷出當前執行緒是否已經停止,但是為什麼第 2 個布林值是 false 呢?讓我們重新閱讀一次文件。

image_1as4qsebm1pvo1tv21laq1kqb1jap2n.png-21.6kB

你看,文件中說的很詳細,interrupted() 方法具有清除狀態的功能,所以第二次的時候返回值是 false。

isInterrupted()

image_1as4psmlbgfhhhgmm31as71dnp13.png-16.1kB

從宣告中可以看出來 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);
        }
    }
}

image_1as4sik741tdg96f1t7n75g1do43h.png-4.3kB

總結

1. interrupted():測試 當前執行緒 是否已經是中斷狀態,執行後具有清除狀態功能

2. isInterrupted():測試執行緒 Thread 物件 是否已經是中斷狀態,但不清楚狀態標誌