線程池Executor
newFixedThreadPool(int nThreads)
線程數(shù)量與最大數(shù)量一致厅须。
使用無界任務(wù)隊(duì)列
返回一個(gè)固定線程數(shù)量的線程池,當(dāng)一個(gè)新的任務(wù)被提交時(shí)惶岭,線程池中如果有空閑線程,則立即執(zhí)行犯眠,否則會被暫存到一個(gè)任務(wù)隊(duì)列中按灶,等線程有空閑的時(shí)候再處理
newSingleThreadExecutor
返回只有一個(gè)線程的線程池,多余的任務(wù)提交到線程池筐咧,會被保存在一個(gè)任務(wù)隊(duì)列中鸯旁,待線程空閑時(shí)按先入先出的順序執(zhí)行隊(duì)列中的任務(wù)
newCachedThreadPool
返回一個(gè)可根據(jù)實(shí)際情況調(diào)整線程數(shù)量的線程池。線程數(shù)量不確定量蕊,若有空閑線程可以復(fù)用铺罢,則優(yōu)先使用可復(fù)用的線程,若沒有空閑進(jìn)程残炮,則會創(chuàng)建新線程來處理任務(wù)韭赘。所有線程在當(dāng)前任務(wù)執(zhí)行完畢后會返回線程池進(jìn)行復(fù)用。
newSingThreadScheduledExecutor
返回一個(gè)可以定時(shí)執(zhí)行任務(wù)的線程池势就。
ThreadPoolExecutor線程池構(gòu)造
線程池內(nèi)部主要是由ThreadPoolExecutor傳入不同的構(gòu)造參數(shù)實(shí)現(xiàn)辞居。
- corePoolSize:線程池?cái)?shù)量
- maximumPoolSize:最大線程數(shù)量,超過這個(gè)數(shù)量的線程會執(zhí)行拒絕策略
- keepAliveTime:超過corePoolSize的空閑線程在多長時(shí)間內(nèi)被銷毀
- unit:keepAliveTime的單位
- workQueue:任務(wù)隊(duì)列蛋勺,被提交但尚未執(zhí)行的任務(wù)
- threadFactor:線程工廠瓦灶,用于創(chuàng)建線程
- handler:拒絕策略,當(dāng)任務(wù)超過maximumPoolSize時(shí)執(zhí)行
任務(wù)隊(duì)列類型
直接提交的隊(duì)列
SynchronousQuene
抱完,沒有容量贼陶,每一個(gè)插入操作都要等待一個(gè)相應(yīng)的刪除操作,反之一樣。使用SynchronousQuene提交的任務(wù)不會被保存到隊(duì)列碉怔,直接將新任務(wù)交給線程執(zhí)行烘贴,如果沒有空閑的線程就會嘗試創(chuàng)建新線程,如果超過最大線程則會執(zhí)行拒絕策略撮胧,使用時(shí)通常會設(shè)置一個(gè)很大的值桨踪。
有界的任務(wù)隊(duì)列
ArrayBlockingQuene
構(gòu)造時(shí)需要一個(gè)容量參數(shù),表示隊(duì)列的最大容量
當(dāng)使用有界的任務(wù)隊(duì)列時(shí)芹啥,若有新的任務(wù)需要執(zhí)行锻离,如果線程池的實(shí)際線程數(shù)小于corePoolSize,則會優(yōu)先創(chuàng)建新的線程墓怀,若大于corePoolSize汽纠,則會將新任務(wù)加入等待隊(duì)列。若等待隊(duì)列己滿傀履,無法加入虱朵,則在總線程數(shù)不大于 maximumPoolSize 的提下,創(chuàng)建新的進(jìn)程執(zhí)行任務(wù)钓账。若大于 maximumPooISize碴犬,則執(zhí)行拒絕策略“鹉海可見服协,有界隊(duì)列僅當(dāng)在任務(wù)隊(duì)列裝滿時(shí),才可能將線程數(shù)提升到 corePooISize 以上惕蹄,換言之蚯涮,除非系統(tǒng)非常繁忙,否則確保核心線程數(shù)維持在在 corePoolSizeo
無界的任務(wù)隊(duì)列
LinkedBlockingQuene
與有界隊(duì)列相比卖陵,除非資源耗盡遭顶,否則不存在入隊(duì)失敗的情況,當(dāng)有新任務(wù)進(jìn)入泪蔫,系統(tǒng)的線程數(shù)小于corePoolSize時(shí)會創(chuàng)建新線程執(zhí)行任務(wù)棒旗,但當(dāng)線程數(shù)大道corePoolSize時(shí)不會繼續(xù)創(chuàng)建,若后續(xù)還有新任務(wù)則會直接進(jìn)入隊(duì)列等待撩荣,如果任務(wù)創(chuàng)建和處理的速度差異很大铣揉,隊(duì)列會一直增長直到資源耗盡
優(yōu)先任務(wù)隊(duì)列
PriorityBlockingQueue
可以控制任務(wù)的執(zhí)行先后順序,是一個(gè)特殊的無界隊(duì)列餐曹。有界隊(duì)列和其他無界隊(duì)列都是按照先進(jìn)先出算法處理任務(wù)逛拱,而PriorityBlockingQueue
可以根據(jù)自身的優(yōu)先級順序先后執(zhí)行。
線程池調(diào)度邏輯
當(dāng)任務(wù)提交后台猴,如果當(dāng)前線程小于corePoolSize朽合,則分配線程執(zhí)行俱两,當(dāng)大于corePoolSize時(shí),會提交到任務(wù)隊(duì)列進(jìn)行等待曹步,如果提交隊(duì)列失斚懿省(比如有界隊(duì)列達(dá)到上線或者使用SynchronousQuene
隊(duì)列),會直接提交到線程池讲婚,若當(dāng)前線程達(dá)到最大數(shù)量尿孔,則執(zhí)行拒絕策略,否則分配線程執(zhí)行筹麸。
線程池?cái)U(kuò)展
ThreadPoolExecutor
提供了三個(gè)方法用于擴(kuò)展活合。
- beforeExecutor 線程開始前執(zhí)行
- afterExecutor 線程執(zhí)行后
- terminiated 線程池退出時(shí)
線程池關(guān)閉
調(diào)用shutdown()
不會立即關(guān)閉線程池,會等待線程池的任務(wù)執(zhí)行完畢后再關(guān)閉竹捉。
確切的說芜辕,shutdown()
會給線程池發(fā)送消息阻止線程池繼續(xù)提交任務(wù)尚骄,并且中斷線程池中空閑的線程块差。如果shutdown后繼續(xù)往線程池提交任務(wù),會拋出rejectedExecution異常
參考鏈接