91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Thread.sleep()要拋出中斷異常的原因是什么

發布時間:2023-05-06 15:46:59 來源:億速云 閱讀:128 作者:iii 欄目:開發技術

本篇內容主要講解“Thread.sleep()要拋出中斷異常的原因是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Thread.sleep()要拋出中斷異常的原因是什么”吧!

從場景說起

假設sleep()方法不拋出中斷異常,也就是線程沒有中斷響應能力,會怎么樣?

考慮如下場景:

線程A:sleep中

線程B:A別睡了,要關機啦(向A發送中斷信號)

線程A:sleep中

這樣好嗎?這不好。因為線程A對外界情況沒有感知能力。

中斷就起到了這樣的作用:讓線程具有感知的能力。sleep(),wait()等方法都需要你去處理中斷異常,也就是需要你的代碼能夠響應中斷。

響應中斷

什么叫能夠響應中斷呢?下面這段最常見的代碼可以響應嗎?

try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    e.printStackTrace();
}

答案是可以響應,但還不夠。為什么呢?

如下圖,官方文檔說了:拋異常的同時,該線程的中斷狀態會被清除。

Thread.sleep()要拋出中斷異常的原因是什么

那中斷狀態清除了,有什么影響嗎?

當然有,我們一般代碼都會這樣寫:(目的:休眠100毫秒后,判斷線程是否被中斷,如果未被中斷則繼續執行業務)

try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    //中斷標志已經被清除了
}
// Thread.currentThread().isInterrupted():是否被中斷了(是否有中斷標志)
if(!Thread.currentThread().isInterrupted()) {
    //如果沒有被中斷,則處理業務
    doSomething();
}

如果你運行起來會發現,即使線程在sleep期間被中斷,我們下面的代碼依然會執行。為什么呢?就是因為sleep是會擦除中斷標志的。

那你可能會說:我為什么要寫if(!Thread.currentThread().isInterrupted())呢?我平時都不判斷的。

首先這是個demo,主要是展示效果。其次,我們任何代碼都要有響應中斷的能力,所以一般加個while(!Thread.currentThread().isInterrupted())。

回到上面的demo,如果要實現休眠100毫秒后,判斷線程是否被中斷,如果未被中斷則繼續執行業務該怎么辦?

很簡單,我們在本線程再中斷一次即可。代碼如下:

try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    //中斷標志已經被清除了
    // 手動中斷本線程,將本線程打上中斷信號。
    Thread.currentThread().interrupt();
}
// Thread.currentThread().isInterrupted():是否被中斷了(是否有中斷標志)
if(!Thread.currentThread().isInterrupted()) {
    //如果沒有被中斷,則處理業務
    doSomething();
}

如上述代碼所示,我們手動調用interrupt()方法即可。這樣業務代碼就不會執行了。

關閉線程池

可能上述理論你還是有些懵。下面進入實戰環節。

那么我們看看線程池如何關閉?

有兩個API:

void shutdown():等待隊列和當前執行的任務會繼續執行完。

List<Runnable> shutdownNow():對所有正在執行的任務線程發送中斷信號。等待隊列的任務會被返回。

這下你知道為什么我們代碼需要有響應中斷的能力了嗎?我們先舉一個無法停掉線程的例子:

ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.execute(()->{
    //任務一直跑
    while (true) {
        System.out.println("1");
    }
});
 
Thread.sleep(10);
executorService.shutdownNow();

你看,我們根本無法停掉任務,根本無法關閉線程池!

所以while(!Thread.currentThread().isInterrupted())才對嘛。

怎么關呢?代碼我就不寫了,關鍵點如下:

1.你的代碼一定要有響應中斷的能力。

2.sleep等方法就有這個能力。但是他會擦除中斷標志位,記得調用Thread.currentThread().interrupt()恢復中斷標志位哦。

到此,相信大家對“Thread.sleep()要拋出中斷異常的原因是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

子长县| 阳朔县| 陵川县| 峨边| 沅江市| 阿克苏市| 潞城市| 保定市| 木兰县| 依兰县| 渭源县| 台江县| 青田县| 黔东| 乐昌市| 新泰市| 高陵县| 莲花县| 独山县| 乐东| 讷河市| 融水| 南陵县| 微山县| 三门峡市| 花垣县| 文昌市| 陆良县| 茂名市| 芜湖市| 运城市| 台江县| 昭觉县| 顺昌县| 阜城县| 镇坪县| 安吉县| 宾川县| 汾阳市| 陆川县| 孙吴县|