JAVA線程池任務數大小設置


線程池究竟設成多大是要看你給線程池處理什么樣的任務,任務類型不同,線程池大小的設置方式也是不同的。

任務一般可分為:CPU密集型、IO密集型、混合型,對於不同類型的任務需要分配不同大小的線程池。

  • CPU密集型任務

盡量使用較小的線程池,一般為CPU核心數+1。
因為CPU密集型任務使得CPU使用率很高,若開過多的線程數,只能增加上下文切換的次數,因此會帶來額外的開銷。

  • IO密集型任務

可以使用稍大的線程池,一般為2*CPU核心數。
IO密集型任務CPU使用率並不高,因此可以讓CPU在等待IO的時候去處理別的任務,充分利用CPU時間。

  • 混合型任務

可以將任務分成IO密集型和CPU密集型任務,然后分別用不同的線程池去處理。
只要分完之后兩個任務的執行時間相差不大,那么就會比串行執行來的高效。
因為如果划分之后兩個任務執行時間相差甚遠,那么先執行完的任務就要等后執行完的任務,最終的時間仍然取決於后執行完的任務,而且還要加上任務拆分與合並的開銷,得不償失

  • 對於計算密集型的程序,線程數應當等於核心數,但是再怎么計算密集,總有一些IO吧,所以再加一個線程來把等待IO的CPU時間利用起來
  • 對於計算密集型的任務,在擁有N個處理器的系統上,當線程池的大小為N+1時,通常能實現最優的效率。(即使當計算密集型的線程偶爾由於缺失故障或者其他原因而暫停時,這個額外的線程也能確保CPU的時鍾周期不會被浪費。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM