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