分析一般從幾個角度考慮:
1.任務的性質:CPU密集型的任務、IO密集型任務、混合型任務。
2.任務的優先級:高、中、低
3.任務執行時間:長、中、短
4.任務的依賴性:是否依賴其它系統資源,如數據庫的連接等。
根據不同的任務可以交給不同規模的線程池執行。
如果是cpu密集型的,盡量減少線程數,如果是IO密集型任務盡量加大線程數,因為io不占用cpu的資源。建議配置2倍CPU個數+1。
如果是混合型的,盡量根據實際情況進行拆分,根據運行時間來決定。
如下為一般計算公式:
最佳線程數目 = ((線程等待時間+線程CPU時間)/線程CPU時間 )* CPU數目
最佳線程數目 = (線程等待時間與線程CPU時間之比 + 1)* CPU數目
線程等待時間所占比例越高,需要越多線程。線程CPU時間所占比例越高,需要越少線程
高並發、任務執行時間短的業務怎樣使用線程池?並發不高、任務執行時間長的業務怎樣使用線程池?並發高、業務執行時間長的業務怎樣使用線程池?
(1)高並發、任務執行時間短的業務,線程池線程數可以設置為CPU核數+1,減少線程上下文的切換
(2)並發不高、任務執行時間長的業務要區分開看:
a)假如是業務時間長集中在IO操作上,也就是IO密集型的任務,因為IO操作並不占用CPU,所以不要讓所有的CPU閑下來,可以適當加大線程池中的線程數目,讓CPU處理更多的業務
b)假如是業務時間長集中在計算操作上,也就是計算密集型任務,這個就沒辦法了,和(1)一樣吧,線程池中的線程數設置得少一些,減少線程上下文的切換
(3)並發高、業務執行時間長,解決這種類型任務的關鍵不在於線程池而在於整體架構的設計,看看這些業務里面某些數據是否能做緩存是第一步,增加服務器是第二步,至於線程池的設置,設置參考(2)。最后,業務執行時間長的問題,也可能需要分析一下,看看能不能使用中間件對任務進行拆分和解耦。