最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Thread.sleep()為什么要拋出中斷異常

 更新時(shí)間:2023年04月21日 15:53:06   作者:君 莫 笑  
本文主要介紹了淺談Thread.sleep()為什么要拋出中斷異常,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

從場(chǎng)景說起

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

考慮如下場(chǎng)景:

線程A:sleep中

線程B:A別睡了,要關(guān)機(jī)啦(向A發(fā)送中斷信號(hào))

線程A:sleep中

這樣好嗎?這不好。因?yàn)榫€程A對(duì)外界情況沒有感知能力。

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

響應(yīng)中斷

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

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

答案是可以響應(yīng),但還不夠。為什么呢?

如下圖,官方文檔說了:拋異常的同時(shí),該線程的中斷狀態(tài)會(huì)被清除。

那中斷狀態(tài)清除了,有什么影響嗎?

當(dāng)然有,我們一般代碼都會(huì)這樣寫:(目的:休眠100毫秒后,判斷線程是否被中斷,如果未被中斷則繼續(xù)執(zhí)行業(yè)務(wù))

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

如果你運(yùn)行起來會(huì)發(fā)現(xiàn),即使線程在sleep期間被中斷,我們下面的代碼依然會(huì)執(zhí)行。為什么呢?就是因?yàn)閟leep是會(huì)擦除中斷標(biāo)志的。

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

首先這是個(gè)demo,主要是展示效果。其次,我們?nèi)魏未a都要有響應(yīng)中斷的能力,所以一般加個(gè)while(!Thread.currentThread().isInterrupted())。

回到上面的demo,如果要實(shí)現(xiàn)休眠100毫秒后,判斷線程是否被中斷,如果未被中斷則繼續(xù)執(zhí)行業(yè)務(wù)該怎么辦?

很簡(jiǎn)單,我們?cè)诒揪€程再中斷一次即可。代碼如下:

try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    //中斷標(biāo)志已經(jīng)被清除了
    // 手動(dòng)中斷本線程,將本線程打上中斷信號(hào)。
    Thread.currentThread().interrupt();
}
// Thread.currentThread().isInterrupted():是否被中斷了(是否有中斷標(biāo)志)
if(!Thread.currentThread().isInterrupted()) {
    //如果沒有被中斷,則處理業(yè)務(wù)
    doSomething();
}

如上述代碼所示,我們手動(dòng)調(diào)用interrupt()方法即可。這樣業(yè)務(wù)代碼就不會(huì)執(zhí)行了。

關(guān)閉線程池

可能上述理論你還是有些懵。下面進(jìn)入實(shí)戰(zhàn)環(huán)節(jié)。

那么我們看看線程池如何關(guān)閉?

有兩個(gè)API:

void shutdown():等待隊(duì)列和當(dāng)前執(zhí)行的任務(wù)會(huì)繼續(xù)執(zhí)行完。

List<Runnable> shutdownNow():對(duì)所有正在執(zhí)行的任務(wù)線程發(fā)送中斷信號(hào)。等待隊(duì)列的任務(wù)會(huì)被返回。

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

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

你看,我們根本無法停掉任務(wù),根本無法關(guān)閉線程池!

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

怎么關(guān)呢?代碼我就不寫了,關(guān)鍵點(diǎn)如下:

1.你的代碼一定要有響應(yīng)中斷的能力。

2.sleep等方法就有這個(gè)能力。但是他會(huì)擦除中斷標(biāo)志位,記得調(diào)用Thread.currentThread().interrupt()恢復(fù)中斷標(biāo)志位哦。

到此這篇關(guān)于淺談Thread.sleep()為什么要拋出中斷異常的文章就介紹到這了,更多相關(guān)Thread.sleep()拋出中斷異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot如何接收數(shù)組參數(shù)的方法

    SpringBoot如何接收數(shù)組參數(shù)的方法

    這篇文章主要介紹了SpringBoot如何接收數(shù)組參數(shù)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java正則表達(dá)式判斷 ip 地址是否正確解析

    java正則表達(dá)式判斷 ip 地址是否正確解析

    這篇文章主要介紹了java正則表達(dá)式判斷 ip 地址是否正確解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Java計(jì)時(shí)器StopWatch實(shí)現(xiàn)方法代碼實(shí)例

    Java計(jì)時(shí)器StopWatch實(shí)現(xiàn)方法代碼實(shí)例

    這篇文章主要介紹了Java計(jì)時(shí)器StopWatch實(shí)現(xiàn)方法代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java如何實(shí)現(xiàn)支付寶電腦支付基于servlet版本

    Java如何實(shí)現(xiàn)支付寶電腦支付基于servlet版本

    這篇文章主要介紹了Java如何實(shí)現(xiàn)支付寶電腦支付基于servlet版本,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java實(shí)現(xiàn)簡(jiǎn)單的加減乘除計(jì)算器

    java實(shí)現(xiàn)簡(jiǎn)單的加減乘除計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的加減乘除計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringBoot整合Shiro的方法詳解

    SpringBoot整合Shiro的方法詳解

    Apache?Shiro是一個(gè)java安全(權(quán)限)框架,Shiro可以非常容易的開發(fā)出足夠好的應(yīng)用,其不僅可以用在javase環(huán)境,也可以用在javaee環(huán)境。本文介紹了SpringBoot整合Shiro的方法,需要的可以參考一下
    2022-05-05
  • java swing實(shí)現(xiàn)的掃雷游戲及改進(jìn)版完整示例

    java swing實(shí)現(xiàn)的掃雷游戲及改進(jìn)版完整示例

    這篇文章主要介紹了java swing實(shí)現(xiàn)的掃雷游戲及改進(jìn)版,結(jié)合完整實(shí)例形式對(duì)比分析了java使用swing框架實(shí)現(xiàn)掃雷游戲功能與相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • Springcloud中的Nacos?Config服務(wù)配置流程分析

    Springcloud中的Nacos?Config服務(wù)配置流程分析

    這篇文章主要介紹了Springcloud中的Nacos?Config服務(wù)配置,本文以用戶微服務(wù)為例,進(jìn)行統(tǒng)一的配置,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 淺談@RequestMapping注解的注意點(diǎn)

    淺談@RequestMapping注解的注意點(diǎn)

    這篇文章主要介紹了淺談@RequestMapping注解的注意點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java多態(tài)的向上轉(zhuǎn)型的概念及實(shí)例分析

    java多態(tài)的向上轉(zhuǎn)型的概念及實(shí)例分析

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于java多態(tài)的向上轉(zhuǎn)型的概念及實(shí)例分析,對(duì)此有興趣的朋友們可以跟著學(xué)習(xí)下。
    2021-05-05

最新評(píng)論

通化市| 萝北县| 晋州市| 肇庆市| 丰镇市| 武山县| 且末县| 溆浦县| 宣城市| 沂水县| 精河县| 和硕县| 南木林县| 无极县| 新余市| 昌图县| 娄底市| 延庆县| 枝江市| 肥东县| 万安县| 汝南县| 尖扎县| 灵武市| 方城县| 漳州市| 莫力| 通海县| 灵山县| 四会市| 子洲县| 阿尔山市| 明水县| 沙田区| 凤城市| 青铜峡市| 新蔡县| 莱芜市| 正镶白旗| 侯马市| 阿克苏市|