新聞中心
在程序開發(fā)中,常常為了提高性能,我們使用多線程進(jìn)行開發(fā),而針對(duì)多線程常常使用線程池來處理,線程池可以帶來很多好處,有興趣的可以看看之前干貨君寫的文章:線程池ThreadPool看完這篇就夠了

成都創(chuàng)新互聯(lián)專注于蒲江縣企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站建設(shè)。蒲江縣網(wǎng)站建設(shè)公司,為蒲江縣等地區(qū)提供建站服務(wù)。全流程按需策劃設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
[[357346]]
那么現(xiàn)在有個(gè)問題來了,在應(yīng)用中,針對(duì)多線程開發(fā),線程數(shù)量我們要怎么設(shè)置才最合理呢?是不是越多越好?
當(dāng)然不是,在多線程中,不得不提的上下文切換
上下文切換
首先在單核CPU中,也是可以處理多線程的,只是CPU通過給每個(gè)線程分配CPU時(shí)間片來處理的,假設(shè)我們有A、B兩個(gè)線程執(zhí)行任務(wù),CPU在非常短的時(shí)間(時(shí)間片)執(zhí)行A線程,然后再執(zhí)行B線程,如此往復(fù)執(zhí)行,不停的切換(切換時(shí)保持之前的狀態(tài)),由于時(shí)間片的間隙非常短,讓我們感覺是同時(shí)執(zhí)行的,即多線程,而這種切換就叫上下文切換。
從上面的描述我們可以知道,上下文切換,必然會(huì)出現(xiàn)之前的狀態(tài)保持和啟動(dòng),必然會(huì)導(dǎo)致性能的損耗,因此多線程的數(shù)量多就不一定快,也就說明了線程數(shù)量不是越多越好。
那么怎么合理的設(shè)置線程數(shù)量呢?
多線程任務(wù)分類
通常針對(duì)多線程一般分為兩類場景:
IO密集型:IO密集型通常指程序運(yùn)行期間,大部分的耗時(shí)是用來進(jìn)行I/O操作,而這個(gè)時(shí)間線程不會(huì)占用CPU來處理。
CPU密集型:CPU密集型通常是指系統(tǒng)運(yùn)行時(shí)會(huì)消耗掉大量的CPU資源,例如需要大量的計(jì)算,一些復(fù)雜運(yùn)算,邏輯處理之類的。
因此針對(duì)不同場景線程的數(shù)量設(shè)置也不一樣
I/O密集型
由于系統(tǒng)運(yùn)行大部分都是在進(jìn)行I/O交互,并不會(huì)暫用cpu資源,因此可以提高線程數(shù),對(duì)線程數(shù)可以用以下計(jì)算公式:
最佳線程數(shù) = ((線程等待時(shí)間+線程CPU時(shí)間)/線程CPU時(shí)間 )* CPU核心數(shù)
這樣假設(shè)線程無等待,最佳線程數(shù) = 1 * CPU核心數(shù),而實(shí)際上線程一般都會(huì)存在等待時(shí)間,可以保守認(rèn)為等待時(shí)間和線程CPU時(shí)間一樣,即 2 * CPU核心數(shù),因此一般都設(shè)置為
最佳線程數(shù) = CPU核心數(shù) * 2
CPU密集型
對(duì)于CPU密集型的,絕大部分都是利用cpu資源進(jìn)行計(jì)算,因此一般對(duì)于此類場景,最佳線程數(shù)量設(shè)置為CPU核心線程數(shù)+1,以充分利用多核心CPU的處理能力。
最佳線程數(shù) = CPU核心數(shù) + 1
java獲取cpu核心數(shù)的方法如下:
Runtime.getRuntime().availableProcessors()
新聞標(biāo)題:線程數(shù)量怎么設(shè)置才最合理
文章URL:http://m.fisionsoft.com.cn/article/cophgsh.html


咨詢
建站咨詢
