Java線程池的增長過程


通過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,線程將被終止。這樣,線程池可以動態的調整池中的線程數。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM