1. 程式人生 > >java執行緒池(ThreadPoolExecutor)原始碼解析三

java執行緒池(ThreadPoolExecutor)原始碼解析三

ctl成員變數

    /**
     * ctl 儲存了兩部分資訊 
     *    workerCount : 執行緒數
     *    runStatus: 執行緒池的狀態
     * 
     * ctl 是一個 AtomicInteger,int 總共 32位(bit),左邊3位用於記錄執行緒池執行狀態,
     * 後面29位用於記錄執行緒數
     * 
     * workerCount 記錄允許開始,還不允許結束的 worker數量。workerCount 可能在某個瞬間
     * 與實際存活執行緒數不一致。比如執行緒工廠(ThreadFactory)建立執行緒失敗了,或者執行緒已經開始
     * 退出,但還沒減少計數。對使用者可見的執行緒數,是通過 workers set 的大小。
     * 
     * runState 提供執行緒池的生命週期控制,主要有以下值,或者說執行緒池有以下狀態
     *    RUNNING: 接收新的任務、處理佇列中的任務
     *    SHUTDOWN: 不接收新的任務,但是處理佇列中的任務
     *    STOP:不接受新的任務,不執行佇列中的任務,中斷處理中的任務
     *    TIDYING: 所有任務都執行完成,workerCount=0,執行緒轉換到TIDYING的過程將
     *             執行鉤子方法terminated()
     *    TERMINATED: terminated() 方法執行完成後,進入TERMINATED 狀態
     *  
     * 為了可以實現狀態的比較,這些狀態值是隨著時間單調遞增的。狀態流轉如下:
     * RUNNING -> SHUTDOWN 
     *    呼叫shutdonw()方法時觸發
     * (RUNNING or SHUTDOWN) -> STOP
     *    呼叫showdownNow()方法時觸發
     * SHUTDOWN -> TIDYING
     *    當佇列和執行緒池都空以後
     * STOP -> TIDYING
     *    當執行緒池為空以後
     * TIDYING -> TERMINATED
     *    當 terminated() 鉤子方法執行完成後
     * 
     * awaitTermination() 方法將阻塞住直到執行緒池到達TERMINATED 狀態
     *  
     * 
     */
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); private static final int COUNT_BITS = Integer.SIZE - 3;//後29位用來存執行緒數 private static final int CAPACITY = (1 << COUNT_BITS) - 1;//最大執行緒數 // runState is stored in the high-order bits private static final int
RUNNING = -1 << COUNT_BITS;//左邊三位 111 private static final int SHUTDOWN = 0 << COUNT_BITS;//左邊三位 000 private static final int STOP = 1 << COUNT_BITS;//左邊三位 001 private static final int TIDYING = 2 << COUNT_BITS;//左邊三位 010 private static final int TERMINATED = 3
<< COUNT_BITS;//左邊三位 011 // Packing and unpacking ctl private 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; } //狀態和執行緒數量取或,構建ctl變數

相關推薦

java執行(ThreadPoolExecutor)原始碼解析

ctl成員變數 /** * ctl 儲存了兩部分資訊 * workerCount : 執行緒數 * runStatus: 執行緒池的狀態 * * ctl 是一個 AtomicI

java執行(ThreadPoolExecutor)原始碼解析

getTask()方法 /* * 依賴當前的配置阻塞或等待指定時間獲取一個任務,如果在發生以下情況那麼 * 當前的worker必須退出,則返回null * 1. 當前執行緒數

java執行(ThreadPoolExecutor)原始碼解析

執行緒池使用如下 public static void main(String[] args) { int coreSize = 1;//核心執行緒數 in

Java併發包原始碼學習系列:執行ThreadPoolExecutor原始碼解析

[toc] 系列傳送門: - [Java併發包原始碼學習系列:AbstractQueuedSynchronizer](https://blog.csdn.net/Sky_QiaoBa_Sum/article/details/112254373) - [Java併發包原始碼學習系列:CLH同步佇列及同步資源

JAVA執行(ThreadPoolExecutor)原始碼分析

中使用ThreadPoolExecutor的常用方式:     例項程式碼1 Java程式碼   Runnable runnable = new CountService(intArr);         ThreadPoolExecutor execute = (T

Java執行ThreadPoolExecutor使用與解析

開發十年,就只剩下這套架構體系了! >>>   

Java併發包原始碼學習系列:執行ScheduledThreadPoolExecutor原始碼解析

[toc] ## ScheduledThreadPoolExecutor概述 我們在上一篇學習了ThreadPoolExecutor的實現原理:[Java併發包原始碼學習系列:執行緒池ThreadPoolExecutor原始碼解析](https://blog.csdn.net/Sky_QiaoBa_Sum

Java執行ThreadPoolExecutor詳解

  1、執行緒池的工作原理?   執行緒池剛建立時,裡面沒有一個執行緒。任務佇列是作為引數傳進來的。不過,就算佇列裡面有任務,執行緒池也不會馬上執行它們。 當呼叫 execute() 方法新增一個任務時,執行緒池會做如下判斷:

Java執行ThreadPoolExecutor

執行緒池    ThreadPoolExecutor 執行緒池是ExecutorService的實現,可以通過Executors執行工廠構造不同型別的執行服務(執行緒池)。    ThreadPoolExecutor執行緒池使用的是阻塞佇列BlockingQueue。

java執行ThreadPoolExecutor類使用詳解

在《阿里巴巴java開發手冊》中指出了執行緒資源必須通過執行緒池提供,不允許在應用中自行顯示的建立執行緒,這樣一方面是執行緒的建立更加規範,可以合理控制開闢執行緒的數量;另一方面執行緒的細節管理交給執行緒池處理,優化了資源的開銷。而執行緒池不允許使用Executors去建立,而要通過ThreadPoolExe

java執行ThreadPoolExecutor和阻塞佇列BlockingQueue,Executor, ExecutorService

ThreadPoolExecutor 引數最全的建構函式 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,

Java執行ThreadPoolExecutor使用和分析(二)

   相關文章目錄:     execute()是 java.util.concurrent.Executor介面中唯一的方法,JDK註釋中的描述是“在未來的某一時刻執行命令command”,即向執行緒池中提交任務,在未來某個時刻執行,提交的任務必須實現

java執行 ThreadPoolExecutor

阿里巴巴的java開發規範上說執行緒池要自己用new建立,方便開發理解執行緒池的各個引數。 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,

如何用java執行做分批次查詢處理 java執行ThreadPoolExecutor的使用

需求是在一個大資料量的表中按條件查詢出資料後做相應的業務。我是使用的java執行緒池ThreadPoolExecutor,實現分批次去查詢,查詢到資料後,又分多個執行緒去做業務。 執行緒池類為 java.util.concurrent.ThreadPoolExecutor,

深入理解java執行ThreadPoolExecutor

幾句閒扯:首先,我想說java的執行緒池真的是很繞,以前一直都感覺新建幾個執行緒一直不退出到底是怎麼實現的,也就有了後來學習ThreadPoolExecutor原始碼。學習原始碼的過程中,最噁心的其實就是幾種狀態的轉換了,這也是ThreadPoolExecutor的核心。花了

java執行ThreadPoolExecutor原理及使用

其構造方法為public class ThreadPoolExecutor extends AbstractExecutorService{<span style="white-space:pre"> </span><div class="li

JAVA執行ThreadPoolExecutor與阻塞佇列BlockingQueue

池技術是典型的享元模式。 頻繁使用new Thread來建立執行緒的方式並不太好。因為每次new Thread新建和銷燬物件效能較差,執行緒缺乏統一管理。好在java提供了執行緒池,它能夠有效的管理、排程執行緒,避免過多的資源消耗。優點如下: 重用

Java執行ThreadPoolExecutor原理詳解

目錄 前言 簡單例項 引數與原理 參考連結 前言 最近java面試,基本都會考察多執行緒的,多執行緒就一定要問執行緒池的,然而我卻在同一個問題上栽跟頭兩次,也是醉醉的。在懊悔之餘所以專門花了一個下午的時間把它詳細總結整理了一遍,也以此告誡自己學東西切不

Java 執行ThreadPoolExecutor(基於jdk1.8)(一)

介紹 執行緒池的作用就是提供一種對執行緒的管理,避免由於過多的建立和銷燬執行緒所造成的開銷。在一個“池”中維護著一定數量的執行緒,達到可重複利用的效果。在Java中,執行緒池的實現主要是通過Threa

Java 執行ThreadPoolExecutor(基於jdk1.8)(二)

private boolean addWorker(Runnable firstTask, boolean core) 首先分析一下引數,firstTask就是指我們使用者傳入的需要執行的認為,