文章轉自 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()