要想合理的配置線程池的大小,首先得分析任務的特性,能夠從如下幾個角度分析:數據庫
性質不一樣的任務能夠交給不一樣規模的線程池執行。編程
對於不一樣性質的任務來講,CPU密集型任務應配置儘量小的線程,如配置CPU個數+1的線程數,IO密集型任務應配置儘量多的線程,由於IO操做不佔用CPU,不要讓CPU閒下來,應加大線程數量,如配置兩倍CPU個數+1,而對於混合型的任務,若是能夠拆分,拆分紅IO密集型和CPU密集型分別處理,前提是二者運行的時間是差很少的,若是處理時間相差很大,則不必拆分了。緩存
若任務對其餘系統資源有依賴,如某個任務依賴數據庫的鏈接返回的結果,這時候等待的時間越長,則CPU空閒的時間越長,那麼線程數量應設置得越大,才能更好的利用CPU。
固然具體合理線程池值大小,須要結合系統實際狀況,在大量的嘗試下比較才能得出,以上只是前人總結的規律。服務器
在這篇如何合理地估算線程池大小?文章中發現了一個估算合理值的公式多線程
最佳線程數目 = ((線程等待時間+線程CPU時間)/線程CPU時間 )* CPU數目
最佳線程數目 = (線程等待時間與線程CPU時間之比 + 1)* CPU數目
線程等待時間所佔比例越高,須要越多線程。線程CPU時間所佔比例越高,須要越少線程。
以上公式與以前的CPU和IO密集型任務設置線程數基本吻合。架構
併發編程網上的一個問題
高併發、任務執行時間短的業務怎樣使用線程池?併發不高、任務執行時間長的業務怎樣使用線程池?併發高、業務執行時間長的業務怎樣使用線程池?
(1)高併發、任務執行時間短的業務,線程池線程數能夠設置爲CPU核數+1,減小線程上下文的切換
(2)併發不高、任務執行時間長的業務要區分開看:
a)假如是業務時間長集中在IO操做上,也就是IO密集型的任務,由於IO操做並不佔用CPU,因此不要讓全部的CPU閒下來,能夠適當加大線程池中的線程數目,讓CPU處理更多的業務
b)假如是業務時間長集中在計算操做上,也就是計算密集型任務,這個就沒辦法了,和(1)同樣吧,線程池中的線程數設置得少一些,減小線程上下文的切換
(3)併發高、業務執行時間長,解決這種類型任務的關鍵不在於線程池而在於總體架構的設計,看看這些業務裏面某些數據是否能作緩存是第一步,增長服務器是第二步,至於線程池的設置,設置參考(2)。最後,業務執行時間長的問題,也可能須要分析一下,看看能不能使用中間件對任務進行拆分和解耦。併發