多線程編程 合理線程數


文章轉自 https://www.cnblogs.com/dennyzhangdd/p/6909771.html?utm_source=itdadao&utm_medium=referral(有整理)

 《Java Concurrency in Practice》即《java並發編程實踐》,如下圖:

 

如上圖,在《Java Concurrency in Practice》一書中,給出了估算線程池大小的公式:

Nthreads=Ncpu*Ucpu*(1+w/c),其中

Ncpu=CPU核心數

Ucpu=cpu使用率,0~1

W/C=等待時間與計算時間的比率

二、實際應用

假設cpu100%運轉,即撇開CPU使用率這個因素,線程數=Ncpu*(1+w/c)。

線程數=CPU核數*(1+等待時間/CPU執行時間)

IO密集型:一般情況下,如果存在IO,那么肯定w/c>1(等待耗時一般都是計算耗時的很多倍),但是需要考慮系統內存有限(每開啟一個線程都需要內存空間),這里需要上服務器測試具體多少個線程數適合(CPU占比、線程數、總耗時、內存消耗)。如果不想去測試,保守點取1即,Nthreads=Ncpu*(1+1)=2Ncpu。這樣設置一般都OK。

計算密集型:假設沒有等待w=0,則W/C=0. Nthreads=Ncpu。

至此結論就是:

IO密集型=2Ncpu(可以測試后自己控制大小,2Ncpu一般沒問題)(常出現於線程中:數據庫數據交互、文件上傳下載、網絡數據傳輸等等)

計算密集型=Ncpu(常出現於線程中:復雜算法)

java中:CPU核數=Runtime.getRuntime().availableProcessors()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM