ThreadPoolExecutor 中關閉線程池的方法
判斷線程池狀態的方法
shutdown()
調用 shutdown() 方法之后線程池並不是立刻就被關閉,因為這時線程池中可能還有任務正在執行,或是任務隊列中有正在等待的任務,它會等待正在執行的任務和隊列中等待的任務執行完畢后才徹底關閉。
注意:調用 shutdown() 方法后如果還有新的任務被提交,線程池則會根據拒絕策略直接拒絕提交的任務。
shutdownNow()
shutdownNow() 表示立刻關閉的意思。在執行 shutdownNow 方法之后,首先會給所有線程池中的線程發送 interrupt 中斷信號嘗試中斷這些任務的執行,然后將任務隊列中的任務轉移到一個 List 中並返回
注意:即便我們調用了 shutdownNow 方法,如果被中斷的線程對於中斷信號不理不睬,那么依然有可能導致任務不會停止。所以我們自己編寫的線程應當具有響應中斷信號的能力。
isShutdown()
isShutdown(),它可以返回 true 或者 false 來判斷線程池是否已經開始了關閉工作,也就是是否執行了 shutdown 或者 shutdownNow 方法。
注意:如果調用 isShutdown() 返回的結果為 true 並不代表線程池此時已經徹底關閉了,這僅僅代表線程池開始了關閉的流程,也就是說,此時可能依然有線程在執行任務,隊列里也可能有等待的任務。
isTerminated()
isTerminated()方法可以檢測線程池是否真正“終結”了,這不僅代表線程池已關閉,同時代表線程池中的所有任務都已經都執行完畢了。
因為我們剛才說過,調用 shutdown 方法之后,線程池會繼續執行里面未完成的任務,不僅包括線程正在執行的任務,還包括正在任務隊列中等待的任務。比如此時已經調用了 shutdown 方法,但是有一個線程依然在執行任務,那么此時調用 isShutdown 方法返回的是 true ,而調用 isTerminated 方法返回的便是 false ,因為線程池中還有任務正在在被執行,線程池並沒有真正“終結”。直到所有任務都執行完畢了,調用 isTerminated() 方法才會返回 true,這表示線程池已關閉並且線程池內部是空的,所有剩余的任務都執行完畢了。
awaitTermination()
調用 awaitTermination 方法后當前線程會嘗試等待一段指定的時間,如果在等待時間內,線程池已關閉並且所有已提交的任務(包括正在執行的和隊列中等待的)都執行完畢,也就是說線程池真正“終結”了,那么方法就返回 true,否則超時返回 fasle。
如果等待期間線程被中斷,方法會拋出 InterruptedException 異常。