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