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

java 優(yōu)雅關(guān)閉線程池的方案

 更新時(shí)間:2020年11月23日 17:23:54   作者:AnonyStar  
這篇文章主要介紹了java 優(yōu)雅關(guān)閉線程池的方案,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下

我們經(jīng)常在項(xiàng)目中使用的線程池,但是是否關(guān)心過線程池的關(guān)閉呢,可能很多時(shí)候直接再項(xiàng)目中直接創(chuàng)建線程池讓它一直運(yùn)行當(dāng)任務(wù)執(zhí)行結(jié)束不在需要了也不去關(guān)閉,這其實(shí)是存在非常大的風(fēng)險(xiǎn)的,大量的線程常駐在后臺(tái)對(duì)系統(tǒng)資源的占用是巨大的 ,甚至引發(fā)異常。所以在我們平時(shí)使用線程池時(shí)需要注意優(yōu)雅的關(guān)閉,這樣可以保證資源的管控。

在 Java 中和關(guān)閉線程池相關(guān)的方法主要有如下:

  • void shutdown()
  • List<Runnable> shutDownNow
  • boolean awaitTermination
  • boolean isShutDown
  • boolean isTerminated

對(duì)于這些方法有著不同的使用和作用,下面我們真的會(huì)這些不同的方法做詳細(xì)的介紹。

ShutDown

shutDown 方法從字面意思我們可以看到是停止關(guān)閉的意思,我們先來看下面的一段代碼,首先我們通過 ThreadPoolExecutor 來創(chuàng)建一個(gè)容量是10的無界線程池,與 FixedThreadPool 類似的,這里手動(dòng)創(chuàng)建可以更好地理解線程池的創(chuàng)建。在后我們提交一千個(gè)任務(wù)執(zhí)行,再執(zhí)行 shutdown 方法進(jìn)行暫停。

 public static void main(String[] args) throws InterruptedException {

  ExecutorService service = new ThreadPoolExecutor(
    10,
    10,
    0L,
    TimeUnit.MILLISECONDS,
    new LinkedBlockingQueue<>());

  for (int i = 0; i < 1000; i++) {
   service.submit(() ->{
    try {
     TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
     System.out.println("接受中斷,不處理~~");
    }
    System.out.println("args = " + Arrays.deepToString(args)+ Thread.currentThread().getName());
   });
  }

  service.shutdown();
 }
  • 我們可以看到結(jié)果所以線程會(huì)正常執(zhí)行結(jié)束后再關(guān)閉線程池,對(duì)于 ShutDown 而言它可以安全的停止一個(gè)線程池,它有幾個(gè)關(guān)鍵點(diǎn)
  • ShutDown 會(huì)首先將線程設(shè)置成 SHUTDOWN 狀態(tài),然后中斷所有沒有正在運(yùn)行的線程
  • 正在執(zhí)行的線程和已經(jīng)在隊(duì)列中的線程并不會(huì)被中斷,說白了就是使用shutDown 方法其實(shí)就是要等待所有任務(wù)正常全部結(jié)束以后才會(huì)關(guān)閉線程池
  • 調(diào)用 shutdown() 方法后如果還有新的任務(wù)被提交,線程池則會(huì)根據(jù)拒絕策略直接拒絕后續(xù)新提交的任務(wù)。

ShutDownNow

這個(gè)方法與上面方法相比較,直觀就是 now ,即立即停止任務(wù),
同樣是上述案列,略作修改如下,

public static void main(String[] args) throws InterruptedException {

  ExecutorService service = new ThreadPoolExecutor(
    10,
    10,
    0L,
    TimeUnit.MILLISECONDS,
    new LinkedBlockingQueue<>(1000));

  for (int i = 0; i < 1000; i++) {
   service.submit(() ->{
    try {
     TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
     System.out.println("接受中斷,結(jié)束線程~~");
     //這里響應(yīng)中斷
     return;
    }
    System.out.println("args = " + Arrays.deepToString(args)+ Thread.currentThread().getName());
   });
  }

  final List<Runnable> runnables = service.shutdownNow();
  System.out.println(runnables);
 }
  • 執(zhí)行上述代碼我們發(fā)現(xiàn),當(dāng)執(zhí)行shutDownNow 方法后,會(huì)像全部正在運(yùn)行的隊(duì)列通知中斷,正在運(yùn)行的線程接收到中斷信號(hào)后選擇處理,而在隊(duì)列中的全部取消執(zhí)行轉(zhuǎn)移到一個(gè)list隊(duì)列中返回,如上述 List<Runnable> runnables ,這里記錄了所有終止的線程

awaitTermination

  • 這個(gè)方法并不是用來關(guān)閉線程池的,首先我們看一下這個(gè)方法的定義:

boolean awaitTermination_(long timeout, TimeUnit unit)_

  • 可以看到這個(gè)方法有兩個(gè)參數(shù),timeout 表示等待的時(shí)間,unit 時(shí)間單位
  • 這個(gè)方法的作用是,調(diào)用后等待timeout時(shí)間后,反饋線程池的狀態(tài),
  • 等待期間(包括進(jìn)入等待狀態(tài)之前)線程池已關(guān)閉并且所有已提交的任務(wù)(包括正在執(zhí)行的和隊(duì)列中等待的)都執(zhí)行完畢,相當(dāng)于線程池已經(jīng)“終結(jié)”了,方法便會(huì)返回 true;
  • 等待超時(shí)時(shí)間到后,第一種線程池“終結(jié)”的情況始終未發(fā)生,方法返回 false;
  • 等待期間線程被中斷,方法會(huì)拋出 InterruptedException 異常。
  • 上面代碼可以修改來測(cè)試,這里不再粘貼代碼

isShutDown

  • isShutDown 方法正如名字,判斷線程池是否停止,返回的是 Boolean 類型,如果已經(jīng)開始停止線程池則返回 true 否則放回false
  • 當(dāng)調(diào)用了shutDown 或shutDownNow 時(shí)之后,會(huì)返回 true 不過需要注意,這時(shí)候只是代表線程池關(guān)閉流程的開始,并不是說線程池已經(jīng)停止了

isTerminated

  • 這個(gè)方法與上面的方法的區(qū)別就是這是正真檢測(cè)線程池是否真的終結(jié)了
  • 這不僅代表線程池已關(guān)閉,同時(shí)代表線程池中的所有任務(wù)都已經(jīng)都執(zhí)行完畢了,因?yàn)樵谡{(diào)用 shutdown方法之后,線程池會(huì)繼續(xù)執(zhí)行里面未完成的任務(wù),包括正在執(zhí)行的任務(wù)和在任務(wù)隊(duì)列中等待的任務(wù)。
  • 如果調(diào)用了 shutdown 方法,但是有一個(gè)線程依然在執(zhí)行任務(wù),那么此時(shí)調(diào)用 isShutdown方法返回的是 true,而調(diào)用 isTerminated方法返回的便是 false,因?yàn)榫€程池中還有任務(wù)正在在被執(zhí)行,線程池并沒有真正“終結(jié)”。
  • 直到所有任務(wù)都執(zhí)行完畢了,調(diào)用 isTerminated()方法才會(huì)返回 true,這表示線程池已關(guān)閉并且線程池內(nèi)部是空的,所有剩余的任務(wù)都執(zhí)行完畢了。

作者:AnonyStar

原文鏈接:https://www.cnblogs.com/i-code/p/14024845.html

以上就是java 優(yōu)雅關(guān)閉線程池的方案的詳細(xì)內(nèi)容,更多關(guān)于Java 關(guān)閉線程池的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JUnit測(cè)試控制@Test執(zhí)行順序的三種方式小結(jié)

    JUnit測(cè)試控制@Test執(zhí)行順序的三種方式小結(jié)

    這篇文章主要介紹了JUnit測(cè)試控制@Test執(zhí)行順序的三種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring與Dubbo搭建一個(gè)簡(jiǎn)單的分布式詳情

    Spring與Dubbo搭建一個(gè)簡(jiǎn)單的分布式詳情

    這篇文章主要介紹了Spring與Dubbo搭建一個(gè)簡(jiǎn)單的分布式詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • 使用java.nio.file?庫(kù)優(yōu)雅的操作文件詳解

    使用java.nio.file?庫(kù)優(yōu)雅的操作文件詳解

    這篇文章主要介紹了使用java.nio.file?庫(kù)優(yōu)雅的操作文件詳解,需要的朋友可以參考下
    2023-05-05
  • 了解Java線程池創(chuàng)建過程

    了解Java線程池創(chuàng)建過程

    那么有沒有一種辦法使得線程可以復(fù)用,就是執(zhí)行完一個(gè)任務(wù),并不被銷毀,而是可以繼續(xù)執(zhí)行其他的任務(wù)?在Java中可以通過線程池來達(dá)到這樣的效果。下面我們來詳細(xì)了解一下吧
    2019-05-05
  • IDEA設(shè)置Tab選項(xiàng)卡快速的操作

    IDEA設(shè)置Tab選項(xiàng)卡快速的操作

    這篇文章主要介紹了IDEA設(shè)置Tab選項(xiàng)卡快速的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理

    SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理

    這篇文章主要介紹了SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Spring MVC 攔截器實(shí)現(xiàn)登錄

    Spring MVC 攔截器實(shí)現(xiàn)登錄

    這篇文章主要介紹了Spring MVC 攔截器實(shí)現(xiàn)登錄,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • 解決idea中@Data標(biāo)簽getset不起作用的問題

    解決idea中@Data標(biāo)簽getset不起作用的問題

    這篇文章主要介紹了解決idea中@Data標(biāo)簽getset不起作用的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • @PathVariable和@RequestParam傳參為空問題及解決

    @PathVariable和@RequestParam傳參為空問題及解決

    這篇文章主要介紹了@PathVariable和@RequestParam傳參為空問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot整合Netty的流程步驟

    SpringBoot整合Netty的流程步驟

    Netty是一個(gè)基于Java的開源網(wǎng)絡(luò)應(yīng)用框架,它提供了高性能、異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)編程能力,Netty旨在幫助開發(fā)者構(gòu)建高性能、高可靠性的網(wǎng)絡(luò)應(yīng)用程序,本文給大家詳細(xì)介紹了SpringBoot整合Netty的流程步驟,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

封丘县| 长沙县| 德钦县| 扎囊县| 灵宝市| 新竹市| 沁源县| 凤庆县| 孟村| 奉贤区| 青冈县| 射阳县| 大关县| 从江县| 保康县| 延庆县| 孟连| 仁化县| 宜丰县| 田林县| 额尔古纳市| 黑龙江省| 石柱| 科技| 通渭县| 武威市| 肃宁县| 莱阳市| 彝良县| 左云县| 迁安市| 南部县| 商丘市| 永川市| 新兴县| 盐亭县| 新密市| 泽库县| 大理市| 黑龙江省| 麦盖提县|