Java執行緒池的增長過程

為何不是夢發表於2019-08-06

通過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之 間關係。

先看一張圖,理解一下增長過程

  1. 當執行緒池小於corePoolsize時,新提交的任務將建立一個新的執行緒執行任務,即使此時執行緒池中存在空閒執行緒。
  2. 當執行緒池達到corePoolSize時,新提交的任務將被放入workQueue中,等待執行緒池中任務排程執行
  3. 當workQueue已滿,且執行緒池<maximumPoolSize 時, 新提交任務會建立新執行緒執行任務
  4. 當提交任務數超過 maximumPoolSize 時,新提交任務由RejectedExecutionHandlier處理
  5. 另外需要特別注意的是,當執行緒池中超過corePoolSize執行緒,空閒時間達到keepAliveTime時,將會關閉空閒執行緒。
  6. 當設定allowCoreThreadTimeOut(true)時,執行緒池中corePoolSize執行緒空閒時間達到keepAliveTime也將關閉
 
當一個任務通過execute( Runnable)方法欲新增到執行緒池時:
  1. 如果此時執行緒池中的數量小於corePoolSize,即使執行緒池中的執行緒都處於空閒狀態,也要建立新的執行緒來處理被新增的任務。
  2. 如果此時執行緒池中的數量等於corePoolSize,但是緩衝佇列workQueue未滿,那麼任務被放入緩衝佇列。
  3. 如果此時執行緒池中的數量大於corePoolSize,緩衝佇列workQueue滿,並且執行緒池中的數量小於maximumPoolSize,建新的執行緒來處理被新增的任務。 
  4. 如果此時執行緒池中的數量大於corePoolSize,緩衝佇列workQueue滿,並且執行緒池中的數量等於maximumPoolSize,那麼通過handler所指定的策略來處理此任務。也就是:處理任務的優先順序為:核心執行緒corePoolSize、 任務佇列workQueue、 最大執行緒maximumPoolSize,
  5. 如果三者都滿了,使用RejectedExecutionHandlier處理被拒絕的任務。(具體怎麼處理,屬於拒絕策略的範疇)
當執行緒池中的執行緒數量大於corePoolSize時,如果某執行緒空閒時間超過keepAliveTime,執行緒將被終止。這樣,執行緒池可以動態的調整池中的執行緒數。 

相關文章