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

Java 停止線程需要注意的地方

 更新時(shí)間:2020年09月12日 09:31:29   作者:dylanguo1012  
這篇文章主要介紹了Java 停止線程需要注意的地方,幫助大家更好的理解和學(xué)習(xí)Java線程的相關(guān)資料,感興趣的朋友可以了解下

Java中停止線程的原則是什么?

在 Java 中, 最好的停止線程的方式是使用中斷 interrupt, 但是這僅僅是會(huì)通知到被終止的線程 "你該停止運(yùn)行了", 被終止的線程自身?yè)碛袥Q定權(quán) (決定是否、以及何時(shí)停止), 這依賴(lài)于請(qǐng)求停止方和被停止方都遵守一種約定好的編碼規(guī)范.

  • 任務(wù)和線程的啟動(dòng)很容易. 在大多數(shù)時(shí)候, 我們都會(huì)讓它們運(yùn)行直到結(jié)束, 或者讓它們自行停止.然而, 有時(shí)候我們希望提前結(jié)束任務(wù)或線程, 或許是因?yàn)橛脩羧∠瞬僮?或者服務(wù)需要被快速關(guān)閉, 或者是運(yùn)行超時(shí)或出錯(cuò)了.
  • 要使任務(wù)和線程能安全、快速、可靠地停止下來(lái), 并不是一件容易的事. Java沒(méi)有提供任何機(jī)制來(lái)安全地終止線程. 但它提供了中斷 (Interruption), 這是一種協(xié)作機(jī)制,能夠使一個(gè)線程終止另一個(gè)線程的當(dāng)前工作.
  • 這種協(xié)作式的方法是必要的, 我們很少希望某個(gè)任務(wù)、線程或服務(wù)立即停止,因?yàn)檫@種立即停止會(huì)使共享的數(shù)據(jù)結(jié)構(gòu)處于不一致的狀態(tài). 相反, 在編寫(xiě)任務(wù)和服務(wù)時(shí)可以使用一種協(xié)作的方式: 當(dāng)需要停止時(shí),它們首先會(huì)清除當(dāng)前正在執(zhí)行的工作, 然后再結(jié)束. 這提供了更好的靈活性, 因?yàn)槿蝿?wù)本身的代碼比發(fā)出取消請(qǐng)求的代碼更清楚如何執(zhí)行清除工作.
  • 生命周期結(jié)束 (End-of-Lifecycle) 的問(wèn)題會(huì)使任務(wù)、服務(wù)以及程序的設(shè)計(jì)和實(shí)現(xiàn)等過(guò)程變得復(fù)雜, 而這個(gè)在程序設(shè)計(jì)中非常重要的要素卻經(jīng)常被忽略. 一個(gè)在行為良好的軟件與勉強(qiáng)運(yùn)的軟件之間的最主要區(qū)別就是, 行為良好的軟件能很完善地處理失敗、關(guān)閉和取消等過(guò)程.

處理中斷的最好方法是什么?

優(yōu)先選擇在方法上拋出異常.

用 throws InterruptedException 標(biāo)記你的方法, 不采用 try 語(yǔ)句塊捕獲異常,以便于該異??梢詡鬟f到頂層, 讓run方法可以捕獲這一異常, 例如:

void subTask() throws InterruptedException
sleep(delay);
}

由于 run 方法內(nèi)無(wú)法拋出 checked Exception (只能用 try catch), 頂層方法必須處理該異常, 避免了漏掉或者被吞掉的情況, 增強(qiáng)了代碼的健壯性.

如果不能拋出中斷, 要怎么做?

如果不想或無(wú)法傳遞 InterruptedException (例如用 run 方法的時(shí)候, 就不讓該方法 throws InterruptedException), 那么應(yīng)該選擇在 catch 子句中調(diào)用 Thread.currentThread().interrupt() 來(lái)恢復(fù)設(shè)置中斷狀態(tài), 以便于在后續(xù)的執(zhí)行依然能夠檢查到剛才發(fā)生了中斷.

代碼演示詳見(jiàn)視頻, 在這里, 線程在sleep期間被中斷, 并且由 catch 捕獲到該中斷, 并重新設(shè)置了中斷狀態(tài), 以便于可以在下一個(gè)循環(huán)的時(shí)候檢測(cè)到中斷狀態(tài), 正常退出.

為什么用 volatile 停止線程不夠全面?

解答: 這種做法是錯(cuò)誤的, 或者說(shuō)是不夠全面的, 在某些情況下雖然可用, 但是某些情況下有嚴(yán)重問(wèn)題。

這種方法在《Java并發(fā)編程實(shí)戰(zhàn)》中被明確指出了缺陷, 我們一起來(lái)看看缺陷在哪里:

此方法錯(cuò)誤的原因在于, 如果我們遇到了線程長(zhǎng)時(shí)間阻塞 (這是一種很常見(jiàn)的情況, 例如生產(chǎn)者消費(fèi)者模式中就存在這樣的情況), 就沒(méi)辦法及時(shí)喚醒它, 或者永遠(yuǎn)都無(wú)法喚醒該線程, 而 interrupt 設(shè)計(jì)之初就是把 wait 等長(zhǎng)期阻塞作為一種特殊情況考慮在內(nèi)了, 我們應(yīng)該用 interrupt 思維來(lái)停止線程.

以上就是Java 停止線程需要注意的地方的詳細(xì)內(nèi)容,更多關(guān)于Java 停止線程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot項(xiàng)目Redis統(tǒng)計(jì)在線用戶的實(shí)現(xiàn)示例

    springboot項(xiàng)目Redis統(tǒng)計(jì)在線用戶的實(shí)現(xiàn)示例

    最近做個(gè)項(xiàng)目需要統(tǒng)計(jì)在線用戶,本文主要介紹了springboot項(xiàng)目Redis統(tǒng)計(jì)在線用戶的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • springboot之security?FilterSecurityInterceptor的使用要點(diǎn)記錄

    springboot之security?FilterSecurityInterceptor的使用要點(diǎn)記錄

    這篇文章主要介紹了springboot之security?FilterSecurityInterceptor的使用要點(diǎn)記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java?File類(lèi)提供的方法與操作

    Java?File類(lèi)提供的方法與操作

    Java使用File類(lèi)來(lái)表示計(jì)算機(jī)系統(tǒng)磁盤(pán)文件的對(duì)象類(lèi)型。File中提供了大量的方法,可以對(duì)文件進(jìn)行增加、刪除、修改、重命名等常規(guī)操作。File類(lèi)的對(duì)象會(huì)存儲(chǔ)文件自身的信息,例如文件在系統(tǒng)中的存儲(chǔ)目錄、文件大小、文件讀寫(xiě)權(quán)限等
    2023-03-03
  • 一文徹底掌握RocketMQ 的存儲(chǔ)模型

    一文徹底掌握RocketMQ 的存儲(chǔ)模型

    這篇文章主要介紹了RocketMQ 的存儲(chǔ)模型,本文的重點(diǎn)在于分析 BrokerServer 的消息存儲(chǔ)模型,筆者按照自己的理解 , 嘗試分析 RocketMQ 的存儲(chǔ)模型,需要的朋友可以參考下
    2022-12-12
  • SpringBoot字段注入和構(gòu)造函數(shù)注入的區(qū)別及說(shuō)明

    SpringBoot字段注入和構(gòu)造函數(shù)注入的區(qū)別及說(shuō)明

    這篇文章主要介紹了SpringBoot字段注入和構(gòu)造函數(shù)注入的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 詳解Java的call by value和call by reference

    詳解Java的call by value和call by reference

    在本篇文章里小編給大家總結(jié)了關(guān)于Java的call by value和call by reference的相關(guān)用法和知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • SpringMVC HttpMessageConverter消息轉(zhuǎn)換器

    SpringMVC HttpMessageConverter消息轉(zhuǎn)換器

    ??HttpMessageConverter???,報(bào)文信息轉(zhuǎn)換器,將請(qǐng)求報(bào)文轉(zhuǎn)換為Java對(duì)象,或?qū)ava對(duì)象轉(zhuǎn)換為響應(yīng)報(bào)文。???HttpMessageConverter???提供了兩個(gè)注解和兩個(gè)類(lèi)型:??@RequestBody,@ResponseBody???,??RequestEntity,ResponseEntity??
    2023-04-04
  • 詳解java中各類(lèi)鎖的機(jī)制

    詳解java中各類(lèi)鎖的機(jī)制

    這篇文章為大家總結(jié)了java中常見(jiàn)的鎖(互斥鎖、讀寫(xiě)鎖、公平鎖與非公平鎖等)的機(jī)制以及如何使用,文中示例代碼講解詳細(xì),需要的可以學(xué)習(xí)一下
    2021-12-12
  • java數(shù)據(jù)結(jié)構(gòu)之插入排序

    java數(shù)據(jù)結(jié)構(gòu)之插入排序

    這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)之插入排序的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • druid監(jiān)控?zé)o法關(guān)閉的坑以及處理方式

    druid監(jiān)控?zé)o法關(guān)閉的坑以及處理方式

    這篇文章主要介紹了druid監(jiān)控?zé)o法關(guān)閉的坑以及處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論

白河县| 塔城市| 偏关县| 登封市| 云梦县| 襄垣县| 宝应县| 博野县| 大邑县| 汉川市| 石城县| 鄂托克旗| 永嘉县| 日照市| 成安县| 东兴市| 苏尼特左旗| 枝江市| 开原市| 南川市| 临海市| 琼结县| 禄丰县| 务川| 宜春市| 永川市| 德令哈市| 济宁市| 仁化县| 曲松县| 邮箱| 渭源县| 印江| 桃园市| 竹北市| 临江市| 巩留县| 九寨沟县| 双柏县| 忻城县| 澳门|