線程池-五種類型作用以及線程池回收增長策略


一、線程池的增長和回收策略
增長策略:默認線程池接收到任務,創建一個線程去執行當前任務,當線程數大於核心線程數,會將任務添加到任務隊列中,當隊列滿了,會創建新的線程去
執行任務。當線程數大於最大線程數停止。並啟動拒絕策略。
回收策略:線程池中線程的數量大於核心線程數量&&有空閑線程&&空閑線程的空閑時間大於了KeepAliveTime時,會對空閑線程進行回收,直到等於核心線程
為止。

keepAliveTime:核心線程數之外線程,最大空閑時間
ThreadFactory: 用來創建線程池中的線程

二、無界隊列的使用
new ThreadPoolExecutor(30,60,60L,TimeUnit.MILLISECONDS,new LinkedBlockQuque());
這個線程吃問題是什么?new LinkedBlockQuque() 無參構造
public LinkedBlockQuque(){
this(Integer.MAX_VALUE);
}
相當於無界隊列,那么這個時候出現的問題,當線程數大於核心線程數時候,新的任務會添加到任務隊列中,由於這個是無界隊列,
那么永遠無法達到線程數大於最大線程數,從而無法觸發拒絕策略。
    如果我們需要使用無屆隊列怎么辦?將最大線程數設置為與核心線程數一樣。這樣保證線程池里面的線程可以充分利用

三、線程池的方式
1、newFixedThreadPool 創建固定數量的線程池,也就是說當前線程池里面有固定數量的線程池,無屆隊列存儲。
如果線程都在使用中,當進入新的線程任務,任務將添加到無屆隊列中。當線程顯示的關閉了。才會被回收。

2、newSingleThreadPool 只有一個線程在運行的線程池,可以保證線程任務順序執行。

3、newCacheThreadPool 線程池中沒有固定數量,如果需要可以隨時創建,其他線程如果可重用了,還會被使用,
還會被回收(默認回收時間是1分鍾)沒有可重用的,就會創建新的線程
 4、newScheduleThreadPool 線程池中有指定數量的線程,線程中空閑線程不會被回收。線程任務可以定時執行或者延遲執行

5、newSingleScheduleThreadPool 線程池中只有一個線程在執行,之后提交的任務將放入到隊列中,可以定時或者延遲執行線程

四、如何設置線程池數
1、根據任務類型,判斷當前任務如果當前任務使用cpu多的話比如計算類。這時候設置采用n+1(其中n代表cpu的核心數)。1代表了如果出現某一任務
暫停,cpu出現了空閑1可以馬上調用使用。也叫cpu密集行
2、如果任務類型,當前任務去網絡讀取,或者讀取文件等多io操作的,這時候采用2n(n代表cpu的核心數) 也叫io密集型





免責聲明!

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



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