JAVA并發(fā)梳理(五)線(xiàn)程池

關(guān)于線(xiàn)程池的實(shí)現(xiàn),各自的特點(diǎn)等稍后再補(bǔ)充。
現(xiàn)在先總結(jié)下如何合理地設(shè)置線(xiàn)程池的大小。

線(xiàn)程池中線(xiàn)程的數(shù)目是跟線(xiàn)程池所要處理的任務(wù)性質(zhì)有關(guān)的

  • 任務(wù)的性質(zhì):CPU密集型任務(wù)、IO密集型任務(wù)、混合型任務(wù)。
  • 任務(wù)的優(yōu)先級(jí):高、中、低。
  • 任務(wù)的執(zhí)行時(shí)間:長(zhǎng)、中、短。
  • 任務(wù)的依賴(lài)性:是否依賴(lài)其他系統(tǒng)資源,如數(shù)據(jù)庫(kù)連接等。

性質(zhì)不同的任務(wù)可以交給不同規(guī)模的線(xiàn)程池執(zhí)行

針對(duì)不同的任務(wù)性質(zhì)而言:

  • CPU密集型任務(wù)應(yīng)配置盡可能小的線(xiàn)程,如配置CPU個(gè)數(shù)+1的線(xiàn)程數(shù)
  • IO密集型任務(wù)應(yīng)配置盡可能多的線(xiàn)程,因?yàn)镮O操作不占用CPU,不要讓CPU閑下來(lái),應(yīng)加大線(xiàn)程數(shù)量,如配置2*CPU個(gè)數(shù)+1
  • 對(duì)于混合型的任務(wù),如果可以拆分,拆分成IO密集型和CPU密集型分別處理,前提是兩者運(yùn)行的時(shí)間是差不多的,如果處理時(shí)間相差很大,則沒(méi)必要拆分了。

任務(wù)對(duì)其他系統(tǒng)資源有依賴(lài)
如某個(gè)任務(wù)依賴(lài)數(shù)據(jù)庫(kù)的連接返回的結(jié)果,這時(shí)候等待的時(shí)間越長(zhǎng),則CPU空閑的時(shí)間越長(zhǎng),那么線(xiàn)程數(shù)量應(yīng)設(shè)置得越大,才能更好的利用CPU。

線(xiàn)程等待時(shí)間所占比例越高,這樣的話(huà)CPU空閑時(shí)間比較多,為了能夠更好的利用CPU,需要較多線(xiàn)程。

最佳線(xiàn)程數(shù)目 = ((線(xiàn)程等待時(shí)間+線(xiàn)程CPU時(shí)間)/線(xiàn)程CPU時(shí)間 )* CPU數(shù)目 

如果線(xiàn)程CPU時(shí)間所占比例越高,說(shuō)明CPU比較繁忙,此時(shí)需要越少線(xiàn)程。
另外,如果線(xiàn)程數(shù)量過(guò)多,線(xiàn)程之間的切換也會(huì)帶來(lái)開(kāi)銷(xiāo)。

根據(jù)短板效應(yīng),真實(shí)的系統(tǒng)吞吐量并不能單純根據(jù)CPU來(lái)計(jì)算。要提高系統(tǒng)吞吐量,就需要從“系統(tǒng)短板”(比如網(wǎng)絡(luò)延遲、IO)著手。

盡量提高短板操作的并行化比率,比如多線(xiàn)程下載技術(shù)
增強(qiáng)短板能力,比如用NIO替代IO

是否使用線(xiàn)程池就一定比使用單線(xiàn)程高效呢?
答案是否定的,比如Redis就是單線(xiàn)程的,但它卻非常高效,基本操作都能達(dá)到十萬(wàn)量級(jí)/s。從線(xiàn)程這個(gè)角度來(lái)看,部分原因在于:多線(xiàn)程帶來(lái)線(xiàn)程上下文切換開(kāi)銷(xiāo),單線(xiàn)程就沒(méi)有這種開(kāi)銷(xiāo)。

來(lái)自并發(fā)編程網(wǎng)上的一個(gè)問(wèn)題:
高并發(fā)、任務(wù)執(zhí)行時(shí)間短的業(yè)務(wù)怎樣使用線(xiàn)程池?
并發(fā)不高、任務(wù)執(zhí)行時(shí)間長(zhǎng)的業(yè)務(wù)怎樣使用線(xiàn)程池?
并發(fā)高、業(yè)務(wù)執(zhí)行時(shí)間長(zhǎng)的業(yè)務(wù)怎樣使用線(xiàn)程池?
(1)高并發(fā)、任務(wù)執(zhí)行時(shí)間短的業(yè)務(wù),線(xiàn)程池線(xiàn)程數(shù)可以設(shè)置為CPU核數(shù)+1,減少線(xiàn)程上下文的切換
(2)并發(fā)不高、任務(wù)執(zhí)行時(shí)間長(zhǎng)的業(yè)務(wù)要區(qū)分開(kāi)看:
  a)假如是業(yè)務(wù)時(shí)間長(zhǎng)集中在IO操作上,也就是IO密集型的任務(wù),因?yàn)镮O操作并不占用CPU,所以不要讓所有的CPU閑下來(lái),可以適當(dāng)加大線(xiàn)程池中的線(xiàn)程數(shù)目,讓CPU處理更多的業(yè)務(wù)
  b)假如是業(yè)務(wù)時(shí)間長(zhǎng)集中在計(jì)算操作上,也就是計(jì)算密集型任務(wù),這個(gè)就沒(méi)辦法了,和(1)一樣吧,線(xiàn)程池中的線(xiàn)程數(shù)設(shè)置得少一些,減少線(xiàn)程上下文的切換
(3)并發(fā)高、業(yè)務(wù)執(zhí)行時(shí)間長(zhǎng),解決這種類(lèi)型任務(wù)的關(guān)鍵不在于線(xiàn)程池而在于整體架構(gòu)的設(shè)計(jì),看看這些業(yè)務(wù)里面某些數(shù)據(jù)是否能做緩存是第一步,增加服務(wù)器是第二步,至于線(xiàn)程池的設(shè)置,設(shè)置參考(2)。最后,業(yè)務(wù)執(zhí)行時(shí)間長(zhǎng)的問(wèn)題,也可能需要分析一下,看看能不能使用中間件對(duì)任務(wù)進(jìn)行拆分和解耦。

引用
并發(fā)下線(xiàn)程池的最佳數(shù)量計(jì)算
如何合理設(shè)置線(xiàn)程池大小
線(xiàn)程池中如何確定線(xiàn)程的數(shù)目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容