先把想說的話說在前面
Java的線程池在設計上我覺得特別牛,其中最大的是能把兩個甚至多個看上去原理不太相同的線程池類型,在不用if/else的語句的情況下,用相同的代碼實現了
線程池的定義及分類
線程池顧名思義就是線程的集合的管理者,線程池可以對集合里面的線程進行增刪查改等操作,Java中提供的線程池有如下幾個,
- newSingleThreadExecutor
- newScheduleThreadPool
- newSingleThreadScheduledExecutor
- newCachedThreadPool
- newFixedThreadPool
這幾類線程池的類型都是通過參數(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue)確定的。下面我們會用一張圖來解釋里面最重要的兩個線程池一個是newCachedThreadPool,另一個是newFixedThreadPool,然后反向說明構造對應的線程池,這幾個參數應該怎么取值。
線程池原理
-
newFixedThreadPool原理
newFixedThreadPool原理解釋圖.png
從圖中可以看到newFixedThreadPool類型的處理任務的過程,當任務到來時,邏輯處理過程如下:
newFixedThreadPool邏輯處理圖
通過上訴邏輯圖我們可知,corePoolSize>0;maximumPoolSize>=0;keepAliveTime >= 0,workQueue需要是LinkedBlockingQueue對象; -
newCachedThreadPool原理圖
image.png
分析上圖可知,corePoolSize=0因為其中么有corePoolSize的概念,maximumPoolSize>0因為需要有線程來處理,keepAliveTime > 0因為需要線程復用,如果等于0,則每次都會新建線程了。而最重要的workQueue的類型是SynchronousQueue,因為此線程池的實現需要有一個無緩沖的隊列性質,簡單來講就是下一個任務到來時,會把前一個任務擠出去。
或許可以總結這樣一段話
newFixedThreadPool利用可緩沖的隊列去等待無存活時長的線程執(zhí)行結束以實現線程復用,newCachedThreadPool利用無緩沖的隊列
SynchronousQueue的poll函數去實現具有存活時間的線程以實現線程復用。所以根據他們兩的特點,newFixedThreadPool的優(yōu)勢在于可以執(zhí)行大量的連續(xù)的耗時任務操作,而newCachedThreadPool對大量的耗時任務操作是沒有優(yōu)勢的,原因在于,newCachedThreadPool對于大量的任務到來會導致線程數量急速膨脹,而newFixedThreadPool卻可以將任務緩沖到隊列中。newCachedThreadPool適合短平慢的業(yè)務。


