【Java 并发编程】线程池机制 ( 线程池状态分析 | 线程池状态转换 | RUNNING | SHUTDOWN | STOP | TIDYING | TERMINATED )
文章目錄
- 一、線程池狀態(tài)分析
一、線程池狀態(tài)分析
線程池的狀態(tài)在 ThreadPoolExecutor 源碼中定義 : private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)) 成員變量的 前 333 位是線程池的狀態(tài)位 , 剩下的 292929 位是線程數(shù) ;
public class ThreadPoolExecutor extends AbstractExecutorService {/*** 主池控制狀態(tài)ctl是一個原子整數(shù)* 兩個概念領域* workerCount,指示有效線程數(shù)* 運行狀態(tài),指示是否運行、關閉等* * 為了將它們打包成一個整數(shù),我們將workerCount限制為* (2^29)-1(約5億)個線程,而不是(2^31)-1(2* 10億)否則可代表。如果這曾經(jīng)是一個問題* 將來,變量可以更改為原子長度,* 下面的移位/遮罩常數(shù)已調整。但在需要之前* 因此,此代碼使用int更快更簡單。* * workerCount是已注冊的工人數(shù)* 允許啟動,不允許停止。該值可能是* 與活動線程的實際數(shù)量暫時不同,* 例如,ThreadFactory在以下情況下無法創(chuàng)建線程:* 當退出線程仍在執(zhí)行時* 終止前的簿記。用戶可見池大小為* 報告為工作集的當前大小。* * 運行狀態(tài)提供主要的生命周期控制,具有以下值:* * 正在運行:接受新任務和處理排隊的任務* 關機:不接受新任務,但處理排隊的任務* 停止:不接受新任務,不處理排隊的任務,* 并中斷正在進行的任務* 整理:所有任務都已終止,workerCount為零,* 正在轉換為狀態(tài)整理的線程* 將運行終止的()鉤子方法* 終止:終止()已完成* * 這些值之間的數(shù)字順序很重要,以允許* 有序比較。運行狀態(tài)隨時間單調增加* 時間,但不需要擊中每個狀態(tài)。這些轉變是:* * 運行->關機* 在調用shutdown()時,可能隱式地在finalize()中* (運行或關閉)->停止* 在調用shutdownNow()時* 關機->整理* 當隊列和池都為空時* 停止->整理* 當池為空時* 清理->終止* 當終止的()鉤子方法完成時* * 等待終止()的線程將在* 國家終止。* * 檢測從關閉到清理的過渡較少* 比您希望的簡單,因為隊列可能會* 非空后為空,關機狀態(tài)下為空,但* 只有在看到它是空的之后,我們才能終止* workerCount為0(有時需要重新檢查——請參閱* 下)。*/private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));private static final int COUNT_BITS = Integer.SIZE - 3;private static final int CAPACITY = (1 << COUNT_BITS) - 1;// runState is stored in the high-order bitsprivate 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;// Packing and unpacking ctlprivate static int runStateOf(int c) { return c & ~CAPACITY; }private static int workerCountOf(int c) { return c & CAPACITY; }private static int ctlOf(int rs, int wc) { return rs | wc; } }簡單的機翻了下 , 如果查看詳細的英文注釋 , 查看 libcore/ojluni/src/main/java/java/util/concurrent/ThreadPoolExecutor.java 源碼 ;
RUNNING 狀態(tài) : 該狀態(tài)下 可以接受新的 Runnable 任務 , 以及 處理阻塞隊列中被添加的 Runnable 任務 ;
SHUTDOWN 狀態(tài) : 不接受新的 Runnable 任務 , 可以處理已經(jīng)添加在阻塞隊列中的 Runnable 任務 ;
STOP 狀態(tài) : 不接受新的 Runnable 任務 , 也不處理已經(jīng)添加在阻塞隊列中的 Runnable 任務 , 正在執(zhí)行的任務也要中斷 ;
TIDYING 狀態(tài) : 停止所有任務 , private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)) 變量設置為 000 ;
TERMINATED 狀態(tài) : 線程池徹底停止 ;
在 RUNNING 狀態(tài) , 調用 shutdown() 方法 , 跳轉到 SHUTDOWN 狀態(tài) , 如果此時阻塞隊列為空 , 線程池的工作線程為 000 , 就自動進入到 TIDYING 狀態(tài) ;
這里的工作線程指的是 核心線程 和 非核心線程 ;
線程池處于 RUNNING 狀態(tài)下 , 正常運行 , 既可以處理新任務 , 也可以處理阻塞隊列中的任務 ; 一旦調用 shutdown() 方法后 , 不再接受新任務 , 將阻塞隊列中的殘留任務執(zhí)行完畢 , 然后進入 TIDYING 狀態(tài) ;
在 RUNNING 狀態(tài) , 調用 shutdownNow() 方法 , 跳轉到 STOP 狀態(tài) , 此時強行將線程池的工作線程 ( 核心線程 和 非核心線程 ) 和 阻塞隊列清空 , 處理完畢后 , 跳轉到 TIDUING 狀態(tài) ;
也就是說 , 不等待當前正在執(zhí)行的任務和阻塞隊列中的任務執(zhí)行完畢 , 立刻跳轉到 TIDYING 狀態(tài) ;
在 TIDYING 狀態(tài)下 , 一般是自動跳轉到 TERMINATED 狀態(tài) ;
總結
以上是生活随笔為你收集整理的【Java 并发编程】线程池机制 ( 线程池状态分析 | 线程池状态转换 | RUNNING | SHUTDOWN | STOP | TIDYING | TERMINATED )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java 并发编程】线程池机制 ( 线
- 下一篇: 【Android 启动过程】Androi