計算密集型
計算密集型,顧名思義就是應用須要很是多的CPU計算資源,在多核CPU時代,咱們要讓每個CPU核心都參與計算,將CPU的性能充分利用起來,這樣纔算是沒有浪費服務器配置,若是在很是好的服務器配置上還運行着單線程程序那將是多麼重大的浪費。對於計算密集型的應用,徹底是靠CPU的核數來工做,因此爲了讓它的優點徹底發揮出來,避免過多的線程上下文切換,比較理想方案是:
線程數 = CPU核數+1
也能夠設置成CPU核數*2,這仍是要看JDK的使用版本,以及CPU配置(服務器的CPU有超線程)。對於JDK1.8來講,裏面增長了一個並行計算,計算密集型的較理想線程數 = CPU內核線程數*2數據庫
IO密集型
對於IO密集型的應用,就很好理解了,咱們如今作的開發大部分都是WEB應用,涉及到大量的網絡傳輸,不只如此,與數據庫,與緩存間的交互也涉及到IO,一旦發生IO,線程就會處於等待狀態,當IO結束,數據準備好後,線程纔會繼續執行。所以從這裏能夠發現,對於IO密集型的應用,咱們能夠多設置一些線程池中線程的數量,這樣就能讓在等待IO的這段時間內,線程能夠去作其它事,提升併發處理效率。
那麼這個線程池的數據量是否是能夠隨便設置呢?固然不是的,請必定要記得,線程上下文切換是有代價的。目前總結了一套公式,對於IO密集型應用:
線程數 = CPU核心數/(1-阻塞係數)
這個阻塞係數通常爲0.8~0.9之間,也能夠取0.8或者0.9。套用公式,對於雙核CPU來講,它比較理想的線程數就是20,固然這都不是絕對的,須要根據實際狀況以及實際業務來調整。
final int poolSize = (int)(cpuCore/(1-0.9))緩存