天天看點

如何合理設定Java線程池大小

《Java并發程式設計實戰》一書中,Brian Goetz和合著者們為線程池大小的優化提供了不少中肯的建議。這非常重要,如果線程池中線程的數量過多,最終它們會競争稀缺的處理器和記憶體資源,浪費大量的時間在上下文切換上。反之,如果線程的數目過少,正如你的應用所面臨的情況,處理器的一些核可能就無法充分利用。Brian Goetz建議,線程池大小與處理器的使用率之比可以使用下面的公式進行估算:

    Nthreads = NCPU * UCPU * (1 + W/C)

其中:

  • NCPU是處理器的核的數目,可以通過Runtime.getRuntime().availableProcessors()得到
  • UCPU是期望的CPU使用率(該值應該介于0和1之間)
  • W/C是等待時間與計算時間的比率