(转)threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别
最近在看并發編程,在使用到ThreadPoolExecutor時,對它的三個關閉方法(shutdown()、shutdownNow()、awaitTermination())產生了興趣,同時又感到迷惑。查了些資料,自己寫了測試代碼,總算有了個比較清晰的認識。下面一起來看看這三個方法:
shutdown()
將線程池狀態置為SHUTDOWN,并不會立即停止:
停止接收外部submit的任務
內部正在跑的任務和隊列里等待的任務,會執行完
等到第二步完成后,才真正停止
shutdownNow()
將線程池狀態置為STOP。企圖立即停止,事實上不一定:
跟shutdown()一樣,先停止接收外部提交的任務
忽略隊列里等待的任務
嘗試將正在跑的任務interrupt中斷
返回未執行的任務列表
它試圖終止線程的方法是通過調用Thread.interrupt()方法來實現的,但是大家知道,這種方法的作用有限,如果線程中沒有sleep 、wait、Condition、定時鎖等應用, interrupt()方法是無法中斷當前的線程的。所以,ShutdownNow()并不代表線程池就一定立即就能退出,它也可能必須要等待所有正在執行的任務都執行完成了才能退出。
但是大多數時候是能立即退出的
awaitTermination(long timeOut, TimeUnit unit)
當前線程阻塞,直到
等所有已提交的任務(包括正在跑的和隊列中等待的)執行完
或者等超時時間到
或者線程被中斷,拋出InterruptedException
然后返回true(shutdown請求后所有任務執行完畢)或false(已超時)
實驗發現,shuntdown()和awaitTermination()效果差不多,方法執行之后,都要等到提交的任務全部執行完才停。
1
shutdown()和shutdownNow()的區別
從字面意思就能理解,shutdownNow()能立即停止線程池,正在跑的和正在等待的任務都停下了。這樣做立即生效,但是風險也比較大;
shutdown()只是關閉了提交通道,用submit()是無效的;而內部該怎么跑還是怎么跑,跑完再停。
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()的區別
shutdown()后,不能再提交新的任務進去;但是awaitTermination()后,可以繼續提交。
awaitTermination()是阻塞的,返回結果是線程池是否已停止(true/false);shutdown()不阻塞。
1
2
總結
優雅的關閉,用shutdown()
想立馬關閉,并得到未執行任務列表,用shutdownNow()
優雅的關閉,并允許關閉聲明后新任務能提交,用awaitTermination()
關閉功能 【從強到弱】 依次是:shuntdownNow() > shutdown() > awaitTermination()
————————————————
版權聲明:本文為CSDN博主「shenlan_____」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u012168222/article/details/52790400
總結
以上是生活随笔為你收集整理的(转)threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 水星mw310r路由器怎么设置(水星mw
- 下一篇: 电脑硬盘资料备份方法(怎么备份电脑硬盘的