1. 程式人生 > >如何合理確定執行緒池的大小

如何合理確定執行緒池的大小

在java中,幾乎所有需要非同步或者併發執行任務的程式都可以使用執行緒池。在開發過程中,合理的使用執行緒池能夠帶來3個好處

  1. 首先是降低資源消耗。通過重複利用已建立的執行緒降低建立執行緒和銷燬執行緒所帶來的開銷。
  2. 提高相應速度。當任務到達時,任務可以不需要等待執行緒建立就立即執行。
  3. 提高執行緒的可管理性。執行緒是稀缺資源,如果無限制的建立,不僅消耗系統資源,同時降低系統的穩定性,使用執行緒池可以進行統一分配、調優和監控。

如何合理的使用執行緒池,如何合理的給出執行緒池的大小,是非常重要的。
對於執行緒池的大小不能過大,也不能過小。過大會有大量的執行緒在相對較少的CPU和記憶體上競爭,過小又會導致空閒的處理器無法工作,浪費資源,降低吞吐率。

對於執行緒池大小的設定,我們需要考慮的問題有:

  • CPU個數
  • 記憶體大小
  • 任務型別,是計算密集型(CPU密集型)還是I/O密集型
  • 是否需要一些稀缺資源,像資料庫連線這種等等
  • 等等

有種簡單的估算方式,設N為CPU個數

  • 對於CPU密集型的應用,執行緒池的大小設定為N+1
  • 對於I/O密集型的應用,執行緒池的大小設定為2N+1
    這種設定方式適合於一臺機器上的應用的型別是單一的,並且只有一個執行緒池,實際情況還需要根據實際的應用進行驗證。

在I/O優化中,以下的估算公式可能更合理
最佳執行緒數量 = ((執行緒等待時間+執行緒CPU時間)/ 執行緒CPU時間)* CPU個數

由公式可得,執行緒等待時間所佔比例越高,需要越多的執行緒。
執行緒CPU時間所佔比例越高,所需的執行緒數越少。