前言
在開發(fā)過程中,合理地使用線程池能夠帶來
3
個好處.
1. 降低資源消耗. 通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗.
2. 提高響應(yīng)速度. 當(dāng)任務(wù)到達(dá)時,任務(wù)可以不需要等到線程創(chuàng)建就能立即執(zhí)行.
3. 提高線程的可管理性. 線程是稀缺資源,如果無限制地創(chuàng)建,不僅會消耗系統(tǒng)資源,還會降低系統(tǒng)的穩(wěn)定性,使用線程池可以進(jìn)行統(tǒng)一分配 調(diào)優(yōu)和監(jiān)控.
本文源碼: 源碼下載
線程池的實(shí)現(xiàn)原理
ThreadPoolExecutor
中的執(zhí)行流程
1. 線程池判斷核心線程池里的線程是否都在執(zhí)行任務(wù). 如果不是,則創(chuàng)建一個新的工作線程來執(zhí)行任務(wù). 如果核心線程池里的線程都在執(zhí)行任務(wù),則進(jìn)入下個流程.
2. 線程池判斷工作隊列是否已經(jīng)滿. 如果工作隊列沒有滿,則將新提交的任務(wù)存儲在這個工作隊列里. 如果工作隊列滿了,則進(jìn)入下個流程.
3. 線程池判斷線程池的線程是否都處于工作狀態(tài)魔熏。如果沒有三圆,則創(chuàng)建一個新的工作線程來執(zhí)行任務(wù). 如果已經(jīng)滿了,則交給飽和策略來處理這個任務(wù).
1. 如果當(dāng)前運(yùn)行的線程少于
corePoolSize
,則創(chuàng)建新線程來執(zhí)行任務(wù).
2. 如果運(yùn)行的線程等于或多于corePoolSize
,則將任務(wù)加入BlockingQueue
.
3. 如果無法將任務(wù)加入BlockingQueue
(隊列已滿), 則創(chuàng)建新的線程來處理任務(wù).
4. 如果創(chuàng)建新線程將使當(dāng)前運(yùn)行的線程超maximumPoolSize
,任務(wù)將被拒絕,并調(diào)用RejectedExecutionHandler.rejectedExecution()
方法.
參考
1.
Java 1.8
源碼
2.Java
并發(fā)編程的藝術(shù)