newFixedThreadPool
線程池的線程數(shù)量達(dá)corePoolSize后,即使線程池沒(méi)有可執(zhí)行任務(wù)時(shí),也不會(huì)釋放線程。
FixedThreadPool的工作隊(duì)列為無(wú)界隊(duì)列LinkedBlockingQueue(隊(duì)列容量為Integer.MAX_VALUE), 這會(huì)導(dǎo)致以下問(wèn)題:
線程池里的線程數(shù)量不超過(guò)corePoolSize,這導(dǎo)致了maximumPoolSize和keepAliveTime將會(huì)是個(gè)無(wú)用參數(shù) 由于使用了無(wú)界隊(duì)列, 所以FixedThreadPool永遠(yuǎn)不會(huì)拒絕,即飽和策略失效。
newSingleThreadExecutor
初始化的線程池中只有一個(gè)線程,如果該線程異常結(jié)束,會(huì)重新創(chuàng)建一個(gè)新的線程繼續(xù)執(zhí)行任務(wù),唯一的線程可以保證所提交任務(wù)的順序執(zhí)行。
由于使用了無(wú)界隊(duì)列,所以SingleThreadPool永遠(yuǎn)不會(huì)拒絕, 即飽和策略失效
newCachedThreadPool
線程池的線程數(shù)可達(dá)到Integer.MAX_VALUE,即2147483647,內(nèi)部使用SynchronousQueue作為阻塞隊(duì)列;
和newFixedThreadPool創(chuàng)建的線程池不同,newCachedThreadPool在沒(méi)有任務(wù)執(zhí)行時(shí),當(dāng)線程的空閑時(shí)間超過(guò)keepAliveTime,會(huì)自動(dòng)釋放線程資源,當(dāng)提交新任務(wù)時(shí),如果沒(méi)有空閑線程,則創(chuàng)建新線程執(zhí)行任務(wù),會(huì)導(dǎo)致一定的系統(tǒng)開(kāi)銷;執(zhí)行過(guò)程與前兩種稍微不同:
主線程調(diào)用SynchronousQueue的offer()方法放入task, 倘若此時(shí)線程池中有空閑的線程嘗試讀取 SynchronousQueue的task,即調(diào)用了SynchronousQueue的poll(), 那么主線程將該task交給空閑線程. 否則執(zhí)行(2) 當(dāng)線程池為空或者沒(méi)有空閑的線程, 則創(chuàng)建新的線程執(zhí)行任務(wù)。執(zhí)行完任務(wù)的線程倘若在60s內(nèi)仍空閑, 則會(huì)被終止。因此長(zhǎng)時(shí)間空閑的CachedThreadPool不會(huì)持有任何線程資源。