1.先看下機器的CPU核數,然後在設定具體參數:
System.out.println(Runtime.getRuntime().availableProcessors());
即CPU核數 = Runtime.getRuntime().availableProcessors()
2.分析下線程池處理的程序是CPU密集型,還是IO密集型
CPU密集型:核心線程數 = CPU核數 + 1
IO密集型:核心線程數 = CPU核數 * 2
注:IO密集型(某大廠實踐經驗)
核心線程數 = CPU核數 / (1-阻塞係數) 例如阻塞係數 0.8,CPU核數爲4
則核心線程數爲20
注:阻塞係數公式
Blocking Coefficient(阻塞係數) = 阻塞時間/(阻塞時間+使用CPU的時間)
CPU密集型:
CPU密集型也叫計算密集型,指的是系統的硬盤、內存性能相對CPU要好很多,此時,系統運作大部分的狀況是CPU Loading 100%,CPU要讀/寫I/O(硬盤/內存),I/O在很短的時間就可以完成,而CPU還有許多運算要處理,CPU Loading很高。
在多重程序系統中,大部份時間用來做計算、邏輯判斷等CPU動作的程序稱之CPU bound。例如一個計算圓周率至小數點一千位以下的程序,在執行的過程當中絕大部份時間用在三角函數和開根號的計算,便是屬於CPU bound的程序。
CPU bound的程序一般而言CPU佔用率相當高。這可能是因爲任務本身不太需要訪問I/O設備,也可能是因爲程序是多線程實現因此屏蔽掉了等待I/O的時間
IO密集型(I/O bound):
IO密集型指的是系統的CPU性能相對硬盤、內存要好很多,此時,系統運作,大部分的狀況是CPU在等I/O (硬盤/內存) 的讀/寫操作,此時CPU Loading並不高。
I/O bound的程序一般在達到性能極限時,CPU佔用率仍然較低。這可能是因爲任務本身需要大量I/O操作,而pipeline做得不是很好,沒有充分利用處理器能力。
轉:https://www.cnblogs.com/bobsha/p/6178995.html,https://blog.csdn.net/youanyyou/article/details/78990156