-
線程池的5種狀態:Running、ShutDown、Stop、Tidying、Terminated。
-
線程池各個狀態切換框架圖:
-
RUNNING:
- 狀態說明:線程池處在RUNNING狀態時,能夠接收新任務,以及對已添加的任務進行處理。
- 狀態切換:線程池的初始化狀態是RUNNING。換句話說,線程池被一旦被創建,就處於RUNNING狀態,並且線程池中的任務數爲0!
-
SHUTDOWN:
- 狀態說明:線程池處在SHUTDOWN狀態時,不接收新任務,但能處理已添加的任務。
- 狀態切換:調用線程池的shutdown()接口時,線程池由RUNNING -> SHUTDOWN。
-
STOP:
- 狀態說明:線程池處在STOP狀態時,不接收新任務,不處理已添加的任務,並且會中斷正在處理的任務。
- 狀態切換:調用線程池的shutdownNow()接口時,線程池由(RUNNING or SHUTDOWN ) -> STOP。
-
TIDYING :
- 狀態說明:當所有的任務已終止,ctl記錄的”任務數量”爲0,線程池會變爲TIDYING狀態。當線程池變爲TIDYING狀態時,會執行鉤子函數terminated()。terminated()在ThreadPoolExecutor類中是空的,若用戶想在線程池變爲TIDYING時,進行相應的處理;可以通過重載terminated()函數來實現。
- 狀態切換:當線程池在SHUTDOWN狀態下,阻塞隊列爲空並且線程池中執行的任務也爲空時,就會由 SHUTDOWN -> TIDYING。
當線程池在STOP狀態下,線程池中執行的任務爲空時,就會由STOP -> TIDYING。
-
TERMINATED:
- 狀態說明:線程池徹底終止,就變成TERMINATED狀態。
- 狀態切換:線程池處在TIDYING狀態時,執行完terminated()之後,就會由 TIDYING -> TERMINATED。
-
線程池的狀態 在源碼中展示:
public class ThreadPoolExecutor extends AbstractExecutorService {
/**
* 線程池狀態-RUNNING :
* 1、功能:允許提交併處理任務;
* 2、狀態轉換:線程池初始化後的狀態
*/
private static final int RUNNING = -1 << COUNT_BITS;
/**
* 線程池狀態-SHUTDOWN:
* 1、功能:不接收新任務,但能處理已添加的任務。
* 2、狀態轉換:當調用shutdown()接口,線程池由RUNNING -> SHUTDOWN。
*/
private static final int SHUTDOWN = 0 << COUNT_BITS;
/**
* 線程池狀態-STOP :
* 1、功能:不允許提交新的任務,也不會處理阻塞隊列中未執行的任務,並設置正在執行的線程的中斷標誌位
* 2、狀態轉換:調用線程池的shutdownNow()接口時,線程池由(RUNNING or SHUTDOWN ) -> STOP
*/
private static final int STOP = 1 << COUNT_BITS;
/**
* 線程池狀態-TIDYING :
* 1、功能:當所有的任務已終止,ctl記錄的”任務數量”爲0,線程池會變爲TIDYING狀態,等待執行terminated()勾子方法
* 【terminated()在ThreadPoolExecutor類中是空的,用戶重載terminated()函數來實現線程池關閉後的業務】
* 2、狀態轉換1:當線程池在SHUTDOWN狀態下,阻塞隊列爲空並且線程池中執行的任務也爲空時,就會由 SHUTDOWN -> TIDYING
* 狀態轉換2:當線程池在STOP狀態下,線程池中執行的任務爲空時,就會由STOP -> TIDYING
*/
private static final int TIDYING = 2 << COUNT_BITS;
/**
* 線程池狀態-TERMINATED :
* 1、功能:線程池徹底終止,就變成TERMINATED狀態
* 2、狀態轉換:線程池處在TIDYING狀態時,執行完terminated()之後,就會由 TIDYING -> TERMINATED。
*/
private static final int TERMINATED = 3 << COUNT_BITS;
// 省略其他代碼
}