本文主要介紹了java 中的線程池刨疼。
線程池的好處:
(1)降低資源的消耗:利用已創(chuàng)建的線程降低創(chuàng)建和銷毀的消耗
(2)提高響應(yīng)時(shí)間趟章,建立在(1) 的基礎(chǔ)上
(3)提高線程的可管理性線程池工作流程 :
提交一個(gè)新的任務(wù)之后
(1) 判斷核心線程池里面是否都在執(zhí)行任務(wù)煤痕,一種情況是線程池剛啟動(dòng)轿偎,里面的核心線程還沒有達(dá)到預(yù)設(shè)的數(shù)量分扎,則創(chuàng)建核心線程池猖闪,并把任務(wù)提交給核心線程執(zhí)行稀火,還有一種情況是暖哨,核心線程池里面有核心線程當(dāng)前處于閑置狀態(tài),則提交任務(wù)給其運(yùn)行凰狞,上述兩種情況都不滿足的情況下篇裁,則核心線程池已滿,處于運(yùn)行狀態(tài)赡若。進(jìn)入下一步判斷
(2)判斷隊(duì)列是否已滿达布,如果沒滿,則任務(wù)進(jìn)入工作隊(duì)列逾冬,否則進(jìn)入下一步黍聂。
(3) 判斷線程池是否都已經(jīng)處于工作狀態(tài),如果都是身腻,則交給飽和策略产还,否則創(chuàng)建新線程執(zhí)行任務(wù)。
- 執(zhí)行示意圖 :
4.線程池關(guān)鍵點(diǎn)介紹
阻塞隊(duì)列部分介紹:
(1) BlockingQueue:
ArrayBlockingQueue: 基于數(shù)組嘀趟,先進(jìn)先出排序雕沉。
LinkedBlockingQueue:基于隊(duì)列。
SynchronizedQueue:不存儲(chǔ)元素的阻塞隊(duì)列去件,每一個(gè)插入操作必須等待另外一個(gè)線程移除操作坡椒,否者插入操作一直處于阻塞狀態(tài)。
PriorityBlockingQueue:具有優(yōu)先級(jí)尤溜。
(2) RejectExecutionHandler :
AbortPolicy: 直接跑出異常
DiscardPolicy:不處理丟掉
CallerRunsPolicy:只用調(diào)用者所在的線程來運(yùn)行任務(wù)倔叼。
DiscardOldestPolicy: 丟棄隊(duì)列中最近的一個(gè)任務(wù),并執(zhí)行當(dāng)前任務(wù)宫莱。
(3) 提交方式:
submit() : 提交有返回值的任務(wù)
excute() : 提交沒有返回值得任務(wù)
(4) 關(guān)閉線程池:
shutdown(): 將狀態(tài)設(shè)置成shutdown 狀態(tài)丈攒,中斷所有沒有正在執(zhí)行任務(wù)的線程。
shutdownNow():將狀態(tài)設(shè)置成STOP狀態(tài),并且嘗試停止所有的線程巡验,并返回等待執(zhí)行任務(wù)的列表际插。
(5)如何合理分配線程池線程數(shù)量:
N 代表CPU
IO密集型:線程數(shù)為 N * 2
CPU 密集型:N+1
混合型:盡可能地拆分乘CPU密集型和IO密集型。
有時(shí)候還需要關(guān)注 任務(wù)的優(yōu)先級(jí)以及 是否依賴于其他的系統(tǒng)資源显设。
(6) 線程池監(jiān)控框弛。
taskCount: 線程池中運(yùn)行任務(wù)的數(shù)量。
completedTaskCount : 運(yùn)行過程中已完成的任務(wù)數(shù)量捕捂。
等等瑟枫。