線程池大小的設(shè)置

線程池大小的設(shè)置

這其實(shí)是一個(gè)面試的考點(diǎn),很多面試官會(huì)問(wèn)你線程池coreSize 的大小來(lái)考察你對(duì)于線程池的理解。
首先針對(duì)于這個(gè)問(wèn)題,我們必須要明確我們的需求是計(jì)算密集型還是IO密集型,只有了解了這一點(diǎn),我們才能更好的去設(shè)置線程池的數(shù)量進(jìn)行限制。

1、計(jì)算密集型:

顧名思義就是應(yīng)用需要非常多的CPU計(jì)算資源,在多核CPU時(shí)代,我們要讓每一個(gè)CPU核心都參與計(jì)算,將CPU的性能充分利用起來(lái),這樣才算是沒(méi)有浪費(fèi)服務(wù)器配置,如果在非常好的服務(wù)器配置上還運(yùn)行著單線程程序那將是多么重大的浪費(fèi)。對(duì)于計(jì)算密集型的應(yīng)用,完全是靠CPU的核數(shù)來(lái)工作,所以為了讓它的優(yōu)勢(shì)完全發(fā)揮出來(lái),避免過(guò)多的線程上下文切換,比較理想方案是:

線程數(shù) = CPU核數(shù)+1,也可以設(shè)置成CPU核數(shù)*2,但還要看JDK的版本以及CPU配置(服務(wù)器的CPU有超線程)。

一般設(shè)置CPU * 2即可。

2、IO密集型

我們現(xiàn)在做的開(kāi)發(fā)大部分都是WEB應(yīng)用,涉及到大量的網(wǎng)絡(luò)傳輸,不僅如此,與數(shù)據(jù)庫(kù),與緩存間的交互也涉及到IO,一旦發(fā)生IO,線程就會(huì)處于等待狀態(tài),當(dāng)IO結(jié)束,數(shù)據(jù)準(zhǔn)備好后,線程才會(huì)繼續(xù)執(zhí)行。因此從這里可以發(fā)現(xiàn),對(duì)于IO密集型的應(yīng)用,我們可以多設(shè)置一些線程池中線程的數(shù)量,這樣就能讓在等待IO的這段時(shí)間內(nèi),線程可以去做其它事,提高并發(fā)處理效率。那么這個(gè)線程池的數(shù)據(jù)量是不是可以隨便設(shè)置呢?當(dāng)然不是的,請(qǐng)一定要記得,線程上下文切換是有代價(jià)的。目前總結(jié)了一套公式,對(duì)于IO密集型應(yīng)用:
線程數(shù) = CPU核心數(shù)/(1-阻塞系數(shù)) 這個(gè)阻塞系數(shù)一般為0.8~0.9之間,也可以取0.8或者0.9。
套用公式,對(duì)于雙核CPU來(lái)說(shuō),它比較理想的線程數(shù)就是20,當(dāng)然這都不是絕對(duì)的,需要根據(jù)實(shí)際情況以及實(shí)際業(yè)務(wù)來(lái)調(diào)整:final int poolSize = (int)(cpuCore/(1-0.9))

針對(duì)于阻塞系數(shù),《Programming Concurrency on the JVM Mastering》即《Java 虛擬機(jī)并發(fā)編程》中有提到一句話:

對(duì)于阻塞系數(shù),我們可以先試著猜測(cè),抑或采用一些性能分析工具或java.lang.management API 來(lái)確定線程花在系統(tǒng)/IO操作上的時(shí)間與CPU密集任務(wù)所耗的時(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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