執行緒池(三)
執行緒池(三)主要介紹執行緒池如何根據不同的場景配置,及簡單的使用示例。如有不正確之處,請斧正,謝謝!
一、配置場景
執行緒池初始化引數:corePoolSize,maxMumPoolSize,keepAlivetime,TimeUnit,ThreadFactory,BlockingQueue,RejectedExecutorHandler。引數不同會產生不同的效果,示例:任務佇列(queue)設定成為一個無界佇列, 那麼maxMumPoolSize將不會起作用,執行緒池的執行緒數等於corePoolSize後,將保持不變。雖然會降低cpu使用率,減少系統資源開銷和上下文切換開銷,但是卻降低了系統吞吐量。除此之外不同的參值,會產生很多不同的效果,看需而定。接下來會給出一些場景配置,供參考。
1、CPU密集型
此場景主要針對CPU資源消耗高,I/O消耗低。CPU消耗高可能是單個任務消耗高或多個任務。執行緒數越高則CPU需要給不同的任務分配時間片,導致頻繁切換上下文,而每次上下文切換需要儲存當前任務狀態,然後執行下一任務,每次都需要如此操作直至結束,浪費大量的系統資源。此時可以減少執行緒數量,設定一個合適值,如果多執行緒之間的任務沒有關聯,則可以使用無界佇列。當執行緒數達到corePoolSize後不變,減少任務的頻繁切換,將更多的資源用在處理任務上。如對於瞬時相應的web請求,當任務較多時可以使用無界佇列
2、I/O密集型
該型別任務對I/O資源消耗多,同時也會消耗CPU資源。因為I/O資源事阻塞的,單行處理,會出現等待I/O操作請求到完成,此時處理器資源可能會空閒,我們便可以適當增多工數量,充分發揮處理器資源。那麼執行緒池可以調整為小型佇列搭配大型執行緒池(但也需要需求平衡點,否則吞吐量仍然會降低)。
3、混合型
等待I/O操作請求和完成期間,CPU資源可能空閒。可以根據任務執行時常、相關性以及優先順序去分配。
附:三種場景下的任務都是本著儘可能最大程度的發揮硬體資源和尋求硬體資源簡的平衡。
目前有網友給出了幾個引數的計算公時,但是不知道是否正確,只能待工作中驗證,不斷加深理解,執行緒池會繼續更新修正。
二、使用示例
從建立到銷燬,演示各個流程。