線程池狀態:
線程池的5種狀態:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED。
見 ThreadPoolExecutor 源碼
// runState is stored in the high-order bits private static final int RUNNING = -1 << COUNT_BITS; private static final int SHUTDOWN = 0 << COUNT_BITS; private static final int STOP = 1 << COUNT_BITS; private static final int TIDYING = 2 << COUNT_BITS; private static final int TERMINATED = 3 << COUNT_BITS;
1. RUNNING:線程池一旦被創建,就處於 RUNNING 狀態,任務數為 0,能夠接收新任務,對已排隊的任務進行處理。
2. SHUTDOWN:不接收新任務,但能處理已排隊的任務。調用線程池的 shutdown() 方法,線程池由 RUNNING 轉變為 SHUTDOWN 狀態。
3. STOP:不接收新任務,不處理已排隊的任務,並且會中斷正在處理的任務。調用線程池的 shutdownNow() 方法,線程池由(RUNNING 或 SHUTDOWN ) 轉變為 STOP 狀態。
4. TIDYING:
- SHUTDOWN 狀態下,任務數為 0, 其他所有任務已終止,線程池會變為 TIDYING 狀態,會執行 terminated() 方法。線程池中的 terminated() 方法是空實現,可以重寫該方法進行相應的處理。
- 線程池在 SHUTDOWN 狀態,任務隊列為空且執行中任務為空,線程池就會由 SHUTDOWN 轉變為 TIDYING 狀態。
- 線程池在 STOP 狀態,線程池中執行中任務為空時,就會由 STOP 轉變為 TIDYING 狀態。
5. TERMINATED:線程池徹底終止。線程池在 TIDYING 狀態執行完 terminated() 方法就會由 TIDYING 轉變為 TERMINATED 狀態。
狀態轉換如圖
JDK 源碼中的解釋如下
狀態:
The runState provides the main lifecyle control, taking on values: RUNNING: Accept new tasks and process queued tasks SHUTDOWN: Don't accept new tasks, but process queued tasks STOP: Don't accept new tasks, don't process queued tasks, and interrupt in-progress tasks TIDYING: All tasks have terminated, workerCount is zero, the thread transitioning to state TIDYING will run the terminated() hook method TERMINATED: terminated() has completed
狀態間的變化
RUNNING -> SHUTDOWN On invocation of shutdown(), perhaps implicitly in finalize() (RUNNING or SHUTDOWN) -> STOP On invocation of shutdownNow() SHUTDOWN -> TIDYING When both queue and pool are empty STOP -> TIDYING When pool is empty TIDYING -> TERMINATED When the terminated() hook method has completed Threads waiting in awaitTermination() will return when the state reaches TERMINATED.