JAVA 線程數量如何設置

《Java併發編程實戰》(http://mng.bz/979c)一書中,Brian Goetz和合著者們爲線程池大小
的優化提供了很多中肯的建議。這很是重要,若是線程池中線程的數量過多,最終它們會競爭
稀缺的處理器和內存資源,浪費大量的時間在上下文切換上。反之,若是線程的數目過少,正
如你的應用所面臨的狀況,處理器的一些核可能就沒法充分利用。Brian Goetz建議,線程池大
小與處理器的利用率之比可使用下面的公式進行估算:
Nthreads = NCPU * UCPU * (1 + W/C)
其中:
❑NCPU是處理器的核的數目,能夠經過Runtime.getRuntime().availableProcessors()獲得
❑UCPU是指望的CPU利用率(該值應該介於0和1之間)
❑W/C是等待時間與計算時間的比率編程

好比4核的處理器NCPU是4,你的程序計算一個方法須要5秒鐘,整個程序運行也就須要5秒鐘,那麼W/C比率應該是100網絡

NCPU利用率但願是100%那麼也就是1,整體程序最佳的線程數應該是4*1*(1+100)=404個線程數,但實際操做中,設置404個線程明顯不能帶來性能的優點,這麼多線程數只會增長上下文來回切換帶來更嚴重的性能問題。多線程

若是你的程序是計算密集型的而且沒有IO操做,那麼建議線程數設置爲cpu核數+1,減小上下文切換。併發

若是你的程序是IO密集型的(包括網絡鏈接等待),那麼能夠按照 Nthreads = NCPU * UCPU * (1 + W/C) 計算線程數.性能

相關文章
相關標籤/搜索