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