ThreadPoolExecutorjava
首先看看ThreadPoolExecutor的構造函數,ThreadPoolExecutor提供了幾個構造函數,咱們先來參數最全構造函數的含義。函數
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
corePoolSize: 線程池維護線程的最少數量
maximumPoolSize:線程池維護線程的最大數量
keepAliveTime: 線程池維護線程所容許的空閒時間
unit: 線程池維護線程所容許的空閒時間的單位
workQueue: 線程池所使用的緩衝隊列
handler: 線程池對拒絕任務的處理策略spa
1,首先前四個參數共同負責線程的建立和銷燬。線程
2,線程池利用隊列來保存等待執行的任務。其中包括無界隊列、有界隊列和同步移交。code
newFixedThreadPool 和 newSingleThreadExecutor 在默認狀況使用的是無界隊列LinkedBlockingQueue.若是任務持續快速的到達,超出了線程池的處理速度,那隊列將會無限制的增大。隊列
更穩妥的方式是使用有界隊列。但有界隊列引出的問題是隊列填滿後,新的任務怎麼處理?這裏引出飽和策略,將在3中說明有哪些飽和策略。同步
對於很是大或者無界的線程池,能夠使用SynchronousQueue來避免任務排隊,以及直接將任務從生產者移交到工做者線程。SynchronousQueue不是一個真正的隊列,它主要是一種在線程之間進行移交的機制。要將元素放進SynchronousQueue中必須有另外一個線程等待接受該任務。若是沒有線程等待,而且線程池大小小於線程池的最大值,則建立一個新的線程。不然根據飽和策略來處理。使用直接移交更加的高效,由於任務會直接移交給執行他的線程,而不是放到隊列中,由他的工做線程從隊列中提取任務。只有當線程池是無界或飽和策略能夠拒絕任務時,SynchronousQueue纔有實際價值。it
3,飽和策略io
「停止」策略是默認的飽和策略,該策略會拋出RejectedExecutionException.class
調用者運行策略實現了一種調節機制,既不會拋棄任務,也不會拋出異常,而是將任務回退到調用者。