【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ù)* 兩個概念領(lǐng)域* workerCount,指示有效線程數(shù)* 運行狀態(tài),指示是否運行、關(guān)閉等* * 為了將它們打包成一個整數(shù),我們將workerCount限制為* (2^29)-1(約5億)個線程,而不是(2^31)-1(2* 10億)否則可代表。如果這曾經(jīng)是一個問題* 將來,變量可以更改為原子長度,* 下面的移位/遮罩常數(shù)已調(diào)整。但在需要之前* 因此,此代碼使用int更快更簡單。* * workerCount是已注冊的工人數(shù)* 允許啟動,不允許停止。該值可能是* 與活動線程的實際數(shù)量暫時不同,* 例如,ThreadFactory在以下情況下無法創(chuàng)建線程:* 當(dāng)退出線程仍在執(zhí)行時* 終止前的簿記。用戶可見池大小為* 報告為工作集的當(dāng)前大小。* * 運行狀態(tài)提供主要的生命周期控制,具有以下值:* * 正在運行:接受新任務(wù)和處理排隊的任務(wù)* 關(guān)機:不接受新任務(wù),但處理排隊的任務(wù)* 停止:不接受新任務(wù),不處理排隊的任務(wù),* 并中斷正在進行的任務(wù)* 整理:所有任務(wù)都已終止,workerCount為零,* 正在轉(zhuǎn)換為狀態(tài)整理的線程* 將運行終止的()鉤子方法* 終止:終止()已完成* * 這些值之間的數(shù)字順序很重要,以允許* 有序比較。運行狀態(tài)隨時間單調(diào)增加* 時間,但不需要擊中每個狀態(tài)。這些轉(zhuǎn)變是:* * 運行->關(guān)機* 在調(diào)用shutdown()時,可能隱式地在finalize()中* (運行或關(guān)閉)->停止* 在調(diào)用shutdownNow()時* 關(guān)機->整理* 當(dāng)隊列和池都為空時* 停止->整理* 當(dāng)池為空時* 清理->終止* 當(dāng)終止的()鉤子方法完成時* * 等待終止()的線程將在* 國家終止。* * 檢測從關(guān)閉到清理的過渡較少* 比您希望的簡單,因為隊列可能會* 非空后為空,關(guān)機狀態(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 任務(wù) , 以及 處理阻塞隊列中被添加的 Runnable 任務(wù) ;
SHUTDOWN 狀態(tài) : 不接受新的 Runnable 任務(wù) , 可以處理已經(jīng)添加在阻塞隊列中的 Runnable 任務(wù) ;
STOP 狀態(tài) : 不接受新的 Runnable 任務(wù) , 也不處理已經(jīng)添加在阻塞隊列中的 Runnable 任務(wù) , 正在執(zhí)行的任務(wù)也要中斷 ;
TIDYING 狀態(tài) : 停止所有任務(wù) , private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)) 變量設(shè)置為 000 ;
TERMINATED 狀態(tài) : 線程池徹底停止 ;
在 RUNNING 狀態(tài) , 調(diào)用 shutdown() 方法 , 跳轉(zhuǎn)到 SHUTDOWN 狀態(tài) , 如果此時阻塞隊列為空 , 線程池的工作線程為 000 , 就自動進入到 TIDYING 狀態(tài) ;
這里的工作線程指的是 核心線程 和 非核心線程 ;
線程池處于 RUNNING 狀態(tài)下 , 正常運行 , 既可以處理新任務(wù) , 也可以處理阻塞隊列中的任務(wù) ; 一旦調(diào)用 shutdown() 方法后 , 不再接受新任務(wù) , 將阻塞隊列中的殘留任務(wù)執(zhí)行完畢 , 然后進入 TIDYING 狀態(tài) ;
在 RUNNING 狀態(tài) , 調(diào)用 shutdownNow() 方法 , 跳轉(zhuǎn)到 STOP 狀態(tài) , 此時強行將線程池的工作線程 ( 核心線程 和 非核心線程 ) 和 阻塞隊列清空 , 處理完畢后 , 跳轉(zhuǎn)到 TIDUING 狀態(tài) ;
也就是說 , 不等待當(dāng)前正在執(zhí)行的任務(wù)和阻塞隊列中的任務(wù)執(zhí)行完畢 , 立刻跳轉(zhuǎn)到 TIDYING 狀態(tài) ;
在 TIDYING 狀態(tài)下 , 一般是自動跳轉(zhuǎn)到 TERMINATED 狀態(tài) ;
總結(jié)
以上是生活随笔為你收集整理的【Java 并发编程】线程池机制 ( 线程池状态分析 | 线程池状态转换 | RUNNING | SHUTDOWN | STOP | TIDYING | TERMINATED )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java 并发编程】线程池机制 ( 线
- 下一篇: 【Java 虚拟机原理】Dalvik 虚