日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(转)threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别

發(fā)布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近在看并發(fā)編程,在使用到ThreadPoolExecutor時,對它的三個關(guān)閉方法(shutdown()、shutdownNow()、awaitTermination())產(chǎn)生了興趣,同時又感到迷惑。查了些資料,自己寫了測試代碼,總算有了個比較清晰的認識。下面一起來看看這三個方法:

shutdown()
將線程池狀態(tài)置為SHUTDOWN,并不會立即停止:

停止接收外部submit的任務(wù)
內(nèi)部正在跑的任務(wù)和隊列里等待的任務(wù),會執(zhí)行完
等到第二步完成后,才真正停止
shutdownNow()
將線程池狀態(tài)置為STOP。企圖立即停止,事實上不一定:

跟shutdown()一樣,先停止接收外部提交的任務(wù)
忽略隊列里等待的任務(wù)
嘗試將正在跑的任務(wù)interrupt中斷
返回未執(zhí)行的任務(wù)列表
它試圖終止線程的方法是通過調(diào)用Thread.interrupt()方法來實現(xiàn)的,但是大家知道,這種方法的作用有限,如果線程中沒有sleep 、wait、Condition、定時鎖等應(yīng)用, interrupt()方法是無法中斷當前的線程的。所以,ShutdownNow()并不代表線程池就一定立即就能退出,它也可能必須要等待所有正在執(zhí)行的任務(wù)都執(zhí)行完成了才能退出。

但是大多數(shù)時候是能立即退出的

awaitTermination(long timeOut, TimeUnit unit)
當前線程阻塞,直到

等所有已提交的任務(wù)(包括正在跑的和隊列中等待的)執(zhí)行完
或者等超時時間到
或者線程被中斷,拋出InterruptedException
然后返回true(shutdown請求后所有任務(wù)執(zhí)行完畢)或false(已超時)

實驗發(fā)現(xiàn),shuntdown()和awaitTermination()效果差不多,方法執(zhí)行之后,都要等到提交的任務(wù)全部執(zhí)行完才停。
1
shutdown()和shutdownNow()的區(qū)別
從字面意思就能理解,shutdownNow()能立即停止線程池,正在跑的和正在等待的任務(wù)都停下了。這樣做立即生效,但是風(fēng)險也比較大;
shutdown()只是關(guān)閉了提交通道,用submit()是無效的;而內(nèi)部該怎么跑還是怎么跑,跑完再停。
1
2
Between client threads and thread pool there is a queue of tasks. When your application shuts down, you must take care of two things: what is happening with queued tasks and how already running tasks are behaving (more on that later). Surprisingly many developers are not shutting down thread pool properly or consciously. There are two techniques: either let all queued tasks to execute (shutdown()) or drop them (shutdownNow()) - it totally depends on your use case.

shutdown()和awaitTermination()的區(qū)別
shutdown()后,不能再提交新的任務(wù)進去;但是awaitTermination()后,可以繼續(xù)提交。
awaitTermination()是阻塞的,返回結(jié)果是線程池是否已停止(true/false);shutdown()不阻塞。
1
2
總結(jié)
優(yōu)雅的關(guān)閉,用shutdown()
想立馬關(guān)閉,并得到未執(zhí)行任務(wù)列表,用shutdownNow()
優(yōu)雅的關(guān)閉,并允許關(guān)閉聲明后新任務(wù)能提交,用awaitTermination()
關(guān)閉功能 【從強到弱】 依次是:shuntdownNow() > shutdown() > awaitTermination()
————————————————
版權(quán)聲明:本文為CSDN博主「shenlan_____」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u012168222/article/details/52790400

總結(jié)

以上是生活随笔為你收集整理的(转)threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。