线程池的各种使用场景
(1)高并發(fā)、任務(wù)執(zhí)行時間短的業(yè)務(wù),線程池線程數(shù)可以設(shè)置為CPU核數(shù)+1,減少線程上下文的切換
(2)并發(fā)不高、任務(wù)執(zhí)行時間長的業(yè)務(wù)要區(qū)分開看:
? ? ? ?a)假如是業(yè)務(wù)時間長集中在IO操作上,也就是IO密集型的任務(wù),因為IO操作并不占用CPU,所以不要讓所有的CPU閑下來,可以加大線程池中的線程數(shù)目,讓CPU處理更多的業(yè)務(wù)
? ? ? ?b)假如是業(yè)務(wù)時間長集中在計算操作上,也就是計算密集型任務(wù),這個就沒辦法了,和(1)一樣吧,線程池中的線程數(shù)設(shè)置得少一些,減少線程上下文的切換
(3)并發(fā)高、業(yè)務(wù)執(zhí)行時間長,解決這種類型任務(wù)的關(guān)鍵不在于線程池而在于整體架構(gòu)的設(shè)計,看看這些業(yè)務(wù)里面某些數(shù)據(jù)是否能做緩存是第一步,增加服務(wù)器是第二步,至于線程池的設(shè)置,設(shè)置參考(2)。最后,業(yè)務(wù)執(zhí)行時間長的問題,也可能需要分析一下,看看能不能使用中間件對任務(wù)進(jìn)行拆分和解耦
?
如何來設(shè)置
? ? ?需要根據(jù)幾個值來決定
? ? ?? ? ?tasks :每秒的任務(wù)數(shù),假設(shè)為500~1000
? ? ?? ? ?taskcost:每個任務(wù)花費時間,假設(shè)為0.1s
? ? ?? ? ?responsetime:系統(tǒng)允許容忍的最大響應(yīng)時間,假設(shè)為1s
? ? ?做幾個計算
? ? ?? ? ?corePoolSize = 每秒需要多少個線程處理??
? ? ? ? ? ? ? ?threadcount = tasks/(1/taskcost) =tasks*taskcout = ?(500~1000)*0.1 = 50~100 個線程。corePoolSize設(shè)置應(yīng)該大于50
? ? ?? ? ?? ? ?根據(jù)8020原則,如果80%的每秒任務(wù)數(shù)小于800,那么corePoolSize設(shè)置為80即可
? ? ?? ? ?queueCapacity = (coreSizePool/taskcost)*responsetime
? ? ?? ? ?? ? ?計算可得 queueCapacity = 80/0.1*1 = 80。意思是隊列里的線程可以等待1s,超過了的需要新開線程來執(zhí)行
? ? ?? ? ?? ? ?切記不能設(shè)置為Integer.MAX_VALUE,這樣隊列會很大,線程數(shù)只會保持在corePoolSize大小,當(dāng)任務(wù)陡增時,不能新開線程來執(zhí)行,響應(yīng)時間會隨之陡增。
? ? ?? ? ?maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost)(最大任務(wù)數(shù)-隊列容量)/每個線程每秒處理能力 = 最大線程數(shù)
? ? ?? ? ?? ? ? 計算可得 maxPoolSize = (1000-80)/10 = 92
? ? ?? ? ?rejectedExecutionHandler:根據(jù)具體情況來決定,任務(wù)不重要可丟棄,任務(wù)重要則要利用一些緩沖機(jī)制來處理
? ? ?? ? ?keepAliveTime和allowCoreThreadTimeout:采用默認(rèn)通常能滿足
總結(jié)
以上是生活随笔為你收集整理的线程池的各种使用场景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html中购物车总金怎么算额,计算购物车
- 下一篇: 手机游戏降低游戏延迟的软件_怎么降低手机