關閉線程池的方法
shutdown()
在調用這個關閉方法時,線程池會根據我們配置的拒絕策略來拒絕掉想要進來的線程,也就是說吧創建執行線程的入口給關閉掉了,直到線程池內的所有線程都執行完成。在調用這個方法完畢之后,並不代表這個線程池就真的都停掉了,只能說他不讓其他線程進來了,然后等到線程池內的線程執行完。
shutdownNow()
shutdownNow相對於shutdown的加強版,因為他可以加快線程的執行的的關閉速度,通過向線程池中的線程發送interrupt中斷信號來達到讓線程盡快結束的目的,於此同時也會和shutdown方法一樣,根據拒絕策略來拒絕掉想要進來的線程。
判斷線程池是否關閉的方法
isShutdown()
這個方法就是用來判斷我們線程是否開始執行了shutdown方法,當沒有調用shutdown方法時,isShutdown返回的false,如果調用了shutdown方法,這個時候isShutdown返回的則是ture,值的注意的是,當isShutdown返回true並不代表這個線程池是關閉狀態了,這個方法只代表着線程有沒有開始執行線程關閉的方法。
isTerminated()
isTerminated就表示着線程池還有沒有線程正在執行,如果當還有線程未執行完成,那么他就會返回false,當線程中所有的任務都執行完成了,那么他才會返回ture。他跟isShutdown不同的是,isShutdown方法表示有沒有開始停止線程池任務,而isTerminated表示的是,停止線程池的任務有沒有執行完成。
awaitTermination()
與isTerminated不同的是,awaitTermination有一個等待時間,如果將等待時間設置為10s,那么在執行這個方法后,awaitTermination方法會等待10s,如果10s內所有的線程都執行完成了,他就會提前返回ture,反之如果到了10s后所有的方法還沒有執行完畢,則會返回false。在等待的同時,如果當先等待的線程收到了interrupt中斷信號,同樣的他也會跑出interrupt的異常。
總結
上面結束的五個方法,其實都是很好的去解決我們業務中常見的停止線程的場景。只要我們將這些方法的作用吃透。在停止線程池的時候,根據我們自己需要的場景來去停止,這樣其實就可以達到了正確停止線程池的目的了。