文章目錄
-
- 一、方法說明
-
- 1、shutdown():停止接收新任務,原來的任務繼續執行
- 2、shutdownNow():停止接收新任務,原來的任務停止執行
- 3、awaitTermination(long timeOut, TimeUnit unit):目前線程阻塞
- 二、差別
-
- 1、shutdown() 和 shutdownNow() 的差別
- 2、shutdown() 和 awaitTermination() 的差別
- 三、總結
ExecutorService
是 Java 提供的線程池,也就是說,每次我們需要使用線程的時候,可以通過
ExecutorService
建立線程。
使用
ExecutorService
類時,經常用到
shutdown()
、
shutdownNow()
、
awaitTermination()
3個方法,下面我們來說說它們的含義和三者的差別 。
一、方法說明
1、shutdown():停止接收新任務,原來的任務繼續執行
英文原意:關閉,倒閉;停工。 這裡的意思是 關閉線程池。與使用資料庫連接配接池一樣,每次使用完畢後,都要關閉線程池。
1、停止接收新的submit的任務;
2、已經送出的任務(包括正在跑的和隊列中等待的),會繼續執行完成;
3、等到第2步完成後,才真正停止;
2、shutdownNow():停止接收新任務,原來的任務停止執行
1、跟 shutdown() 一樣,先停止接收新submit的任務;
2、忽略隊列裡等待的任務;
3、嘗試将正在執行的任務interrupt中斷;
4、傳回未執行的任務清單;
說明:它試圖終止線程的方法是通過調用 Thread.interrupt() 方法來實作的,這種方法的作用有限,如果線程中沒有sleep 、wait、Condition、定時鎖等應用, interrupt() 方法是無法中斷目前的線程的。是以,shutdownNow() 并不代表線程池就一定立即就能退出,它也可能必須要等待所有正在執行的任務都執行完成了才能退出。但是大多數時候是能立即退出的。
3、awaitTermination(long timeOut, TimeUnit unit):目前線程阻塞
timeout 和 TimeUnit 兩個參數,用于設定逾時的時間及機關
目前線程阻塞,直到:
- 等所有已送出的任務(包括正在跑的和隊列中等待的)執行完;
- 或者 等逾時時間到了(timeout 和 TimeUnit設定的時間);
- 或者 線程被中斷,抛出InterruptedException
然後會監測 ExecutorService 是否已經關閉,傳回true(shutdown請求後所有任務執行完畢)或false(已逾時)
二、差別
1、shutdown() 和 shutdownNow() 的差別
shutdown()
隻是關閉了送出通道,用submit()是無效的;而内部該怎麼跑還是怎麼跑,跑完再停。
shutdownNow()
能立即停止線程池,正在跑的和正在等待的任務都停下了。
2、shutdown() 和 awaitTermination() 的差別
shutdown()
後,不能再送出新的任務進去;但是
awaitTermination()
後,可以繼續送出。
awaitTermination()
是阻塞的,傳回結果是線程池是否已停止(true/false);
shutdown()
不阻塞。
三、總結
1、優雅的關閉,用 shutdown()
2、想立馬關閉,并得到未執行任務清單,用shutdownNow()
3、優雅的關閉,并允許關閉聲明後新任務能送出,用 awaitTermination()
4、關閉功能 【從強到弱】 依次是:shuntdownNow() > shutdown() > awaitTermination()