在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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

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

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

回答
編輯回答
命多硬

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

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

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

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

比如你上面的代碼,sleep響應(yīng)了中斷,當(dāng)線程在seep中的時(shí)候,如果這個(gè)時(shí)候有中斷的請(qǐng)求,就會(huì)拋出InterruptedException異常,并且清除中斷狀態(tài),所以我們有時(shí)候需要再置為中斷狀態(tài)(其實(shí)就是需要保持這個(gè)中斷狀態(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");
                        //拋出異常后會(huì)清除中斷標(biāo)記位,所以需要重新設(shè)置中斷狀態(tài),讓(1)出的代碼可以檢測(cè)到中斷結(jié)束線程
                        Thread.currentThread().interrupt();
                    }

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