「池」,就是一個工廠,會提早生產出一些東西供使用。因此線程池就是處理多線程的一種方式。
其做用就在於:複用已有資源,控制資源總量多線程
若是不使用線程池,那麼:
(1)使用單線程,可是這種方式吞吐量很是低,且請求量一大效率就會顯得很是低。
(2)那若是對於每一個請求都開一個線程去處理,這樣一旦請求量過大的時候,線程的建立和銷燬都要花費時間,而且線程自己也要佔用必定的內存。線程
使用線程池後,既能夠解決單線程低吞吐量和響應慢的問題,又解決了爲每個請求建立線程所耗費的資源問題。code
線程池經過限制線程的數量,可使線程數維持在一個合理的數量,充分發揮了CPU的做用。隊列
並且,線程池遵循了生產者消費者模式,將任務的建立和執行解耦。內存
public class ThreadPoolExecutor extends AbstractExecutorService { public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler); }
這裏是ThreadPoolExecutor最重要的一個構造方法
(1)corePoolSize : 線程池中維護線程的最少數量
當線程數少於corePoolSize時,就建立一條新的任務,無論是否有空閒的線程。資源
(2)maximumPoolSize: 線程池中維護線程的最大數量
當線程數到達corePoolSize,而且都不空閒,那麼新任務都放到任務隊列中去。當任務隊列放滿以後,若是線程數小於maximumPoolSize,就繼續建立新線程。同步
(3)keepAliveTime:線程池維護線程所容許的空閒時間
若是線程空閒的時間超過keepAliveTime,那麼就撤銷它。it
(4)unit: 線程池維護線程所容許的空閒時間的單位io
(5)workQueue: 線程池所使用的緩衝隊列
通常採用阻塞隊列,有不少種:
無界阻塞隊列、有界阻塞隊列、同步移交隊列class
(6)handler: 線程池對拒絕任務的處理策略
AbortPolicy:丟棄任務並拋出RejectedExecutionException異常。
DiscardPolicy:也是丟棄任務,可是不拋出異常。
DiscardOldestPolicy:丟棄隊列最前面的任務,而後從新嘗試執行任務(重複此過程)
CallerRunsPolicy:由調用線程處理該任務
一、CachedThreadPool
先查看有沒有可用的線程,沒有再建立新線程
二、FixedThreadPool
與上一種差很少,可是不容許隨時建立新線程
任意時間點,最多隻能有固定數目的活動線程存在,此時若是有新的線程要創建,只能放在另外的隊列中等待,直到當前的線程中某個線程終止直接被移出池子。
三、ScheduledThreadPool
這個池子裏的線程能夠按 schedule 依次 delay 執行,或週期執行
四、SingleThreadExecutor任意時間內池子裏只能有一個線程。