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就是指我們使用者傳入的需要執行的認為,