ThreadPoolExecutor系列一——ThreadPoolExecutor 機制

                                      ThreadPoolExecutor 機制

                                               本文系作者原創,轉載請註明出處:http://www.cnblogs.com/further-further-further/p/7681529.html

解決問題:

1、 處理大量異步任務時能減少每個任務的資源開銷;

2、 線程通過線程池管理,減少線程的資源開銷;

3、 統計當前任務完成數量以及活躍線程數;

個人認爲關鍵是線程池與任務隊列如何完美協作

通過下圖說明ThreadPoolExecutor機制

 

1. 線程池中現有線程(current threads) < corePoolSize(線程池基本線程)

i> 保證線程池中線程數量達到corePoolSize大小 (allowCoreThreadTimeOut=true 除外)

ii> 如果新提交一個任務(new task submitted),即使當前現有線程處於idle狀態,線程池也會啓動一個新的線程來處理該任務;

iii> 如果新提交一個任務(new task submitted),線程池(Executor)優先開啓線程處理task,而不是進queue,

直到current threads >= corePoolSize時,new task 先進入queue然後等待處理;

 

2. corePoolSize(線程池基本線程) < 線程池中現有線程 < maximumPoolSize(線程池最大線程)

i> 如果新提交一個任務(new task submitted),只有當queue已滿的情況下,線程池纔會啓動一個新的線程來處理,

否則只有等當前線程處理完任務後再來處理new task;

ii> 超過了線程駐留時間(Keep-alive time),超過的線程(currrent size - corePoolSize)終止,釋放資源;

setKeepAliveTime動態調整駐留空閒時間;


3. 線程池中現有線程(current threads) > maximumPoolSize(線程池最大線程)

i> 如果新提交一個任務(new task submitted),線程池還是會創建一個新的線程,只不過new task 被拒絕(rejected);

 

new task 被拒絕(rejected)處理策略:

a> ThreadPoolExecutor.AbortPolicy : 運行時拋出異常(RejectedExecutionException)

b> ThreadPoolExecutor.CallerRunsPolicy: 該線程通過簡單的反饋控制機制來重新處理該任務的請求,減慢任務入隊列的時間,
從而達到線程處理任務的速度快於任務到達隊列的速度;

優點:不拋出異常中斷線程,不丟失任務;如下圖

 

c> ThreadPoolExecutor.DiscardPolicy: 直接扔掉任務

d> ThreadPoolExecutor.DiscardOldestPolicy: 按照進入順序扔掉隊列另一端最先進入的任務,騰出空間,然後將新任務入隊列;

 

 

不要讓懶惰佔據你的大腦,不要讓妥協拖垮你的人生。青春就是一張票,能不能趕上時代的快車,你的步伐掌握在你的腳下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章