線程池之ThreadPoolExecutor狀態控制

讀懂ThreadPoolExecutor執行原理,需要先掌握其狀態控制的方式,因為使用了大量位運算,讀起來有點吃力,所以單獨用一篇文章分析。以下是ThreadPoolExecutor狀態控制的主要變量和方法:

    //原子狀態控制數
    private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
    //29比特位
    private static final int COUNT_BITS = Integer.SIZE - 3;
    //實際容量 2^29-1
    private static final int CAPACITY   = (1 << COUNT_BITS) - 1;

    // runState is stored in the high-order bits
    // runState存儲在高位中
    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;

    // Packing and unpacking ctl 打包和解壓ctl

    // 解壓runState
    private static int runStateOf(int c)     { return c & ~CAPACITY; }
    // 解壓workerCount
    private static int workerCountOf(int c)  { return c & CAPACITY; }
    // 打包ctl
    private static int ctlOf(int rs, int wc) { return rs | wc; }

線程池使用一個AtomicInteger的ctl變量將 workerCount(工作線程數量)和 runState(運行狀態)兩個字段壓縮在一起 ,這種做法在在java源碼里經常有出現,如在 ReentrantReadWriteLock 里就將一個int分成高16位和底16位,分別表示讀鎖狀態和寫鎖狀態。ThreadPoolExecutor里也是使用了同樣的思想,表現得更加復雜。

ThreadPoolExecutor用3個比特位表示runState, 29個比特位表示workerCount。因此這里需要特別說明的是:

確切的說,當最大線程數量配置為Integer.MXA_VAULE時,ThreadPoolExecutor的線程最大數量依然是2^29-1。

目前來看這是完全夠用的,但隨著計算機的不斷發展,真的到了不夠用的時候可以改變為AtomicLong。這如同32位系統時間戳會在2038年01月19日03時14分07秒耗盡一樣,當以后我們的系統線程能夠超過2^29-1時,這些代碼就需要調整了。對于未來,無限可能。

思考一下為什么是29:3呢?
這是因為我們的運營狀態有5種,向上取2次方數,2^3 = 8。所以必須要3個比特位來表示各種狀態。

運行狀態解釋:

狀態 解釋
RUNNING 運行態,可處理新任務并執行隊列中的任務
SHUTDOW 關閉態,不接受新任務,但處理隊列中的任務
STOP 停止態,不接受新任務,不處理隊列中任務,且打斷運行中任務
TIDYING 整理態,所有任務已經結束,workerCount = 0 ,將執行terminated()方法
TERMINATED 結束態,terminated() 方法已完成
整個ctl的狀態,會在線程池的不同運行階段進行CAS轉換。

多線程系列目錄(不斷更新中):
線程啟動原理
線程中斷機制
多線程實現方式
FutureTask實現原理
線程池之ThreadPoolExecutor概述
線程池之ThreadPoolExecutor使用
線程池之ThreadPoolExecutor狀態控制
線程池之ThreadPoolExecutor執行原理
線程池之ScheduledThreadPoolExecutor概述
線程池的優雅關閉實踐

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。