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: 按照進入順序扔掉隊列另一端最先進入的任務,騰出空間,然後將新任務入隊列;
不要讓懶惰佔據你的大腦,不要讓妥協拖垮你的人生。青春就是一張票,能不能趕上時代的快車,你的步伐掌握在你的腳下。