通過ThreadPoolExecutor的方式建立執行緒池
ThreadPoolExecutor 構造方法:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { //code... }
引數的意義:
1.corePoolSize 指定了執行緒池裡的執行緒數量,核心執行緒池大小
2.maximumPoolSize 指定了執行緒池裡的最大執行緒數量
3.keepAliveTime 當執行緒池執行緒數量大於corePoolSize時候,多出來的空閒執行緒,多長時間會被銷燬。
4.unit 時間單位
5.workQueue 任務佇列,用於存放提交但是尚未被執行的任務。
6.threadFactory 執行緒工廠,用於建立執行緒,一般可以用預設的
7.handler 拒絕策略,當任務過多時候,如何拒絕任務。當提交任務數超過maximumPoolSize + workQueue 的size之和,任務交給RejectedExecutionHandler 處理
執行緒池的增長
執行緒池的增長與建立自定義執行緒池時設定的引數密切相關,重點講解比較容易讓人誤解的 corePoolsize, maximumPoolsize, workQueue之 間關係。
先看一張圖,理解一下增長過程
- 當執行緒池小於corePoolsize時,新提交的任務將建立一個新的執行緒執行任務,即使此時執行緒池中存在空閒執行緒。
- 當執行緒池達到corePoolSize時,新提交的任務將被放入workQueue中,等待執行緒池中任務排程執行
- 當workQueue已滿,且執行緒池<maximumPoolSize 時, 新提交任務會建立新執行緒執行任務
- 當提交任務數超過 maximumPoolSize 時,新提交任務由RejectedExecutionHandlier處理
- 另外需要特別注意的是,當執行緒池中超過corePoolSize執行緒,空閒時間達到keepAliveTime時,將會關閉空閒執行緒。
- 當設定allowCoreThreadTimeOut(true)時,執行緒池中corePoolSize執行緒空閒時間達到keepAliveTime也將關閉
當一個任務通過execute( Runnable)方法欲新增到執行緒池時:
- 如果此時執行緒池中的數量小於corePoolSize,即使執行緒池中的執行緒都處於空閒狀態,也要建立新的執行緒來處理被新增的任務。
- 如果此時執行緒池中的數量等於corePoolSize,但是緩衝佇列workQueue未滿,那麼任務被放入緩衝佇列。
- 如果此時執行緒池中的數量大於corePoolSize,緩衝佇列workQueue滿,並且執行緒池中的數量小於maximumPoolSize,建新的執行緒來處理被新增的任務。
- 如果此時執行緒池中的數量大於corePoolSize,緩衝佇列workQueue滿,並且執行緒池中的數量等於maximumPoolSize,那麼通過handler所指定的策略來處理此任務。也就是:處理任務的優先順序為:核心執行緒corePoolSize、 任務佇列workQueue、 最大執行緒maximumPoolSize,
- 如果三者都滿了,使用RejectedExecutionHandlier處理被拒絕的任務。(具體怎麼處理,屬於拒絕策略的範疇)