原文地址:https://blog.csdn.net/l_kanglin/article/details/57411851java
線程池的5種狀態:Running、ShutDown、Stop、Tidying、Terminated。框架
線程池各個狀態切換框架圖:函數
一、RUNNINGspa
(1) 狀態說明:線程池處在RUNNING狀態時,可以接收新任務,以及對已添加的任務進行處理。
(02) 狀態切換:線程池的初始化狀態是RUNNING。換句話說,線程池被一旦被建立,就處於RUNNING狀態,而且線程池中的任務數爲0!.net
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
二、 SHUTDOWN線程
(1) 狀態說明:線程池處在SHUTDOWN狀態時,不接收新任務,但能處理已添加的任務。
(2) 狀態切換:調用線程池的shutdown()接口時,線程池由RUNNING -> SHUTDOWN。code
三、STOPblog
(1) 狀態說明:線程池處在STOP狀態時,不接收新任務,不處理已添加的任務,而且會中斷正在處理的任務。
(2) 狀態切換:調用線程池的shutdownNow()接口時,線程池由(RUNNING or SHUTDOWN ) -> STOP。接口
四、TIDYING隊列
(1) 狀態說明:當全部的任務已終止,ctl記錄的」任務數量」爲0,線程池會變爲TIDYING狀態。當線程池變爲TIDYING狀態時,會執行鉤子函數terminated()。terminated()在ThreadPoolExecutor類中是空的,若用戶想在線程池變爲TIDYING時,進行相應的處理;能夠經過重載terminated()函數來實現。
(2) 狀態切換:當線程池在SHUTDOWN狀態下,阻塞隊列爲空而且線程池中執行的任務也爲空時,就會由 SHUTDOWN -> TIDYING。
當線程池在STOP狀態下,線程池中執行的任務爲空時,就會由STOP -> TIDYING。
五、 TERMINATED
(1) 狀態說明:線程池完全終止,就變成TERMINATED狀態。 (2) 狀態切換:線程池處在TIDYING狀態時,執行完terminated()以後,就會由 TIDYING -> TERMINATED。