国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:27日期:2022-08-20 16:04:43

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

在 Java 中和關閉線程池相關的方法主要有如下:

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

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

ShutDown

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

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é)果所以線程會正常執(zhí)行結(jié)束后再關閉線程池,對于 ShutDown 而言它可以安全的停止一個線程池,它有幾個關鍵點 ShutDown 會首先將線程設置成 SHUTDOWN 狀態(tài),然后中斷所有沒有正在運行的線程 正在執(zhí)行的線程和已經(jīng)在隊列中的線程并不會被中斷,說白了就是使用shutDown 方法其實就是要等待所有任務正常全部結(jié)束以后才會關閉線程池 調(diào)用 shutdown() 方法后如果還有新的任務被提交,線程池則會根據(jù)拒絕策略直接拒絕后續(xù)新提交的任務。

ShutDownNow

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

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é)束線程~~'); //這里響應中斷 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),當執(zhí)行shutDownNow 方法后,會像全部正在運行的隊列通知中斷,正在運行的線程接收到中斷信號后選擇處理,而在隊列中的全部取消執(zhí)行轉(zhuǎn)移到一個list隊列中返回,如上述 List<Runnable> runnables ,這里記錄了所有終止的線程

awaitTermination

這個方法并不是用來關閉線程池的,首先我們看一下這個方法的定義:

boolean awaitTermination_(long timeout, TimeUnit unit)_

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

isShutDown

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

isTerminated

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

作者:AnonyStar

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

以上就是java 優(yōu)雅關閉線程池的方案的詳細內(nèi)容,更多關于Java 關閉線程池的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 欧美成人www在线观看网页 | 国产精品亚洲专区在线播放 | 韩国欧美一级毛片 | 国产伦精品一区二区三区四区 | 精品 日韩 国产 欧美在线观看 | 日韩美女视频网站 | 拍真实国产伦偷精品 | 国产人成久久久精品 | 欧美性色生活片天天看99 | 国产日韩欧美综合一区二区三区 | 欧美一级特黄aaaaaa在线看片 | 日韩一级性生活片 | www.黄色免费网站 | 中文字幕s级优女区 | 欧美成人小视频 | 久久欧美精品欧美久久欧美 | 国产在线不卡午夜精品2021 | 国产成人女人视频在线观看 | 中文字幕精品一区二区2021年 | 一区二区三区视频 | 丝袜精品 欧美 亚洲 自拍 | 在线成人欧美 | 中文字幕亚洲欧美日韩不卡 | 黄网站色成年小说系列 | 日本污污网站 | 夜色成人性y | 亚洲巨乳自拍在线视频 | 国产一区二区三区在线免费 | 超清首页 国产 亚洲 丝袜 | 亚洲欧美一二三区 | 一级a毛片免费观看久久精品 | 精品久久久久久久久免费影院 | 亚洲欧美日韩高清在线看 | 成人三级视频在线观看 | 中文国产成人精品少久久 | 成人久久 | 亚洲欧洲日产国码二区首页 | 欧美成人精品在线 | 伊人短视频 | 黄色香蕉视频 | 97精品国产福利一区二区三区 |