一張圖看懂執行緒池原理
執行緒池的定義及分類
執行緒池顧名思義就是執行緒的集合的管理者,執行緒池可以對集合裡面的執行緒進行增刪查改等操作,Java中提供的執行緒池有如下幾個,
- newSingleThreadExecutor
- newScheduleThreadPool
- newSingleThreadScheduledExecutor
- newCachedThreadPool
- newFixedThreadPool
這幾類執行緒池的型別都是通過引數(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue)
確定的。下面我們會用一張圖來解釋裡面最重要的兩個執行緒池一個是newCachedThreadPool
,另一個是newFixedThreadPool
,然後反向說明構造對應的執行緒池,這幾個引數應該怎麼取值。
執行緒池原理
-
newFixedThreadPool原理
newFixedThreadPool原理解釋圖.png
newFixedThreadPool邏輯處理圖
corePoolSize>0;maximumPoolSize>=0;keepAliveTime >= 0,workQueue需要是LinkedBlockingQueue物件
;
-
newCachedThreadPool原理圖
image.png
corePoolSize=0
因為其中麼有corePoolSize的概念,maximumPoolSize>0
因為需要有執行緒來處理,keepAliveTime > 0
因為需要執行緒複用,如果等於0,則每次都會新建執行緒了。而最重要的workQueue
的型別是SynchronousQueue
,因為此執行緒池的實現需要有一個無緩衝的佇列性質,簡單來講就是下一個任務到來時,會把前一個任務擠出去。
或許可以總結這樣一段話
newFixedThreadPool利用可緩衝的佇列去等待無存活時長的執行緒執行結束以實現執行緒複用,newCachedThreadPool利用無緩衝的佇列 SynchronousQueue
的 poll
函式去實現具有存活時間的執行緒以實現執行緒複用。所以根據他們兩的特點,newFixedThreadPool的優勢在於可以執行大量的耗時任務操作,而newCachedThreadPool對大量的耗時任務操作是沒有優勢的,原因在於,newCachedThreadPool對於大量的任務到來會導致執行緒數量急速膨脹,而newFixedThreadPool確可以將任務緩衝到佇列中。newCachedThreadPool適合短平慢的業務。