關於interrupt()、isInterrupted()和interrupted()區別

public class RightWayInterrupted {

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

        Thread threadOne = new Thread(new Runnable() {
            @Override
            public void run() {
                for (; ; ) {
                }
            }
        });

        // 啓動線程
        threadOne.start();
        //設置中斷標誌
        threadOne.interrupt();
        //獲取中斷標誌
        System.out.println("isInterrupted1: " + threadOne.isInterrupted() + "查詢的線程"+threadOne.getName());
        //獲取中斷標誌並重置
        System.out.println("isInterrupted2: " + threadOne.interrupted()+ "查詢的線程"+Thread.currentThread().getName());
        //獲取中斷標誌並重直
        System.out.println("isInterrupted3: " + Thread.interrupted()+ "查詢的線程"+Thread.currentThread().getName());
        //獲取中斷標誌
        System.out.println("isInterrupted4: " + threadOne.isInterrupted()+ "查詢的線程"+threadOne.getName());
        Thread.currentThread().interrupt();
        //獲取中斷標誌並重置
        System.out.println("isInterrupted5: " + threadOne.interrupted()+ "查詢的線程"+Thread.currentThread().getName());
        //獲取中斷標誌並重直
        System.out.println("isInterrupted6: " + Thread.interrupted() + "查詢的線程"+Thread.currentThread().getName());
        threadOne.join();
        System.out.println("Main thread is over.");
    }
}

 查看了很多文章,對interrupt()、isInterrupted()和interrupted()區別都說的讓人不太清晰,寫下對這個三個的理解,多多指教!

運行結果是:

isInterrupted1: true查詢的線程Thread-0
isInterrupted2: false查詢的線程main
isInterrupted3: false查詢的線程main
isInterrupted4: true查詢的線程Thread-0
isInterrupted5: true查詢的線程main
isInterrupted6: false查詢的線程main

從結果可以看出 threadOne.interrupt()實際上是給Thread-0增加了中斷標記,所以isInterrupted1是true,

threadOne.interrupted()實際上是查詢主線程有沒有設置中斷標記, 
Thread.interrupted()查詢當前線程也就是主線程的中斷狀態,主線程沒有中斷過所以isInterrupted3和isInterrupted2都是false
Thread.currentThread().interrupt();是給主線程main設置中斷標記
threadOne.interrupted()會查詢主線程狀態好把狀態清除掉所以isInterrupted5: true,isInterrupted6: false

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章