天天看點

Java線程池如何合理配置核心線程數?

Java線程池如何合理配置核心線程數?分下面兩個步驟分析:

第一步:先看下機器的CPU核數,然後再設定具體參數

<code>CPU核數=Runtime.getRuntime().availableProcessors()</code>

第二步:分析下線程池處理的程式是CPU密集型,還是IO密集型

<code>CPU 密集型</code>:核心線程數 = CPU核數 + 1

<code>IO 密集型</code>:核心線程數 = CPU核數 * 2

注意:IO密集型 (某大廠實戰經驗)

<code>核心線程數 = CPU核數 / (1 - 阻塞系數)</code>

例如阻塞系數為0.8 ,CPU核數為 4 ,則核心線程數為 20

CPU密集型也叫計算密集型,指的是系統的硬碟,記憶體性能相對CPU要好很多,此時,系統運作大部分的狀況是CPU loading 100%,CPU要讀/寫 I/O (硬碟/記憶體),I/O在很短的時間就可以完成,而CPU還有很多運算要處理,CPU loading很高。

在多重程式系統中,大部分時間用來做計算,邏輯判斷等CPU動作的程式稱之為 CPU 密集型。例如一個計算圓周率至小數點一千位以下的程式,在執行過程中絕大部分時間用在三角函數和開根号的計算,便是屬于CPU 密集型的程式。

CPU密集型的程式一般而且CPU 占用率相當高。這可能是因為任務本身不太需要通路 I/O 裝置,也可能是因為程式是多線程實作是以屏蔽了等待 I/O 的時間。

IO密集型指的是系統的CPU性能相對硬碟,記憶體要好很多,此時,系統運作,大部分的狀況是CPU在等IO(硬碟/記憶體)的讀/寫 操作,此時CPU loading并不高。

IO密集型的程式一般在達到性能極限時,CPU占用率仍然較低。這可能是因為任務本身需要大量 IO 操作,而pipeline 做得不是很好,沒有充分利用處理器能力。

一般把任務劃分為 計算密集型和 IO 密集型。

計算密集型任務:特點是要進行大量的計算,消耗CPU資源。比如計算圓周率,對視訊進行高清解碼等,全靠CPU的運算能力。這種計算密集型任務雖然也可以用多任務完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低,是以,要最高效的利用CPU,計算密集型任務同時進行的數量應當等于CPU的核心數。

計算密集型任務由于主要消耗CPU資源,是以,代碼運作效率非常重要。例如腳本語言運作效率很低,完全不适合計算密集型任務。

IO密集型任務: 涉及到網絡,磁盤IO的任務都是IO密集型任務。這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為 IO 的速度遠遠低于CPU和記憶體的速度)。對于IO密集型任務,任務越多,CPU效率越高,但也有一個限度。常見的大部分任務都是IO密集型任務,比如Web應用。

IO密集型任務執行期間,99% 的時間都花在IO上,花在CPU上的時間很少,是以,如果用運作速度極快的C語言替換用Python這樣運作速度極低的腳本語言,完全無法提升運作效率。對于IO密集型任務,最合适的語言就是開發效率最高(代碼量最少)的語言,腳本語言是首選,C語言最差。

小結:

計算密集型程式适合C語言或Java語言多線程執行,IO密集型适合腳本語言開發的多線程。

繼續閱讀