鍍金池/ 問答/Java  網(wǎng)絡安全/ 線程的中斷狀態(tài)

線程的中斷狀態(tài)

void mySubTask(){
try{sleep(delay)}
catch(InterruptedException e){Thread.currentThread.interrupt();}
}

這串代碼是《java核心技術》中并發(fā)一節(jié)的。14.2中斷線程,634頁。

當線程處于阻塞狀態(tài)時,對其發(fā)送一個中斷信號,會導致拋出InterruptedException異常。那么以上代碼,在捕捉了這個異常后為什么還要對其設置中斷狀態(tài)呢?換句話說,這里設置中斷狀態(tài),意義何在呢?

回答
編輯回答
命多硬

wait中拋出InterruptedException 會消耗此線程的中斷狀態(tài)

再中斷一次可能是為了向外傳遞?

2018年4月29日 02:54
編輯回答
兮顏

拋出異常后會清除中斷標記位,調(diào)用Thread.currentThread.interrupt()重新設置中斷狀態(tài),讓調(diào)用方知道是由于中斷才結束線程的。

比如你上面的代碼,sleep響應了中斷,當線程在seep中的時候,如果這個時候有中斷的請求,就會拋出InterruptedException異常,并且清除中斷狀態(tài),所以我們有時候需要再置為中斷狀態(tài)(其實就是需要保持這個中斷狀態(tài))。

public class Test {
    public static int count = 0;
    public static void main(String[] args) throws InterruptedException {
        Thread th = new Thread(){
            @Override
            public void run() {
                while(true){
                    if(Thread.currentThread().isInterrupted()){//(1)
                        System.out.println("Thread Interrupted");
                        break;
                    }
                    System.out.println("invoking!!!");
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        System.out.println("Interruted When Sleep");
                        //拋出異常后會清除中斷標記位,所以需要重新設置中斷狀態(tài),讓(1)出的代碼可以檢測到中斷結束線程
                        Thread.currentThread().interrupt();
                    }

                }
            }
        };
        th.start();
        Thread.currentThread().sleep(1000);
        th.interrupt();
    }
}
打印結果:
invoking!!!
Interruted When Sleep
Thread Interrupted
2017年12月29日 17:30