线程池应该设置多少核心线程数——Java多线程系列学习笔记
前言
本章主要討論線程池合適的線程數量是多少,以及 CPU 核心數和線程數的關系。我們調整線程池中的線程數量的最主要的目的是為了充分并合理地使用 CPU 和內存等資源,從而最大限度地提高程序的性能。在實際工作中,我們需要根據任務類型的不同選擇對應的策略。
?
1. CPU密集型
第一種是 CPU 密集型任務,比如加密、解密、壓縮、計算等一系列需要大量耗費 CPU 資源的任務。
最佳線程數 = CPU 核心數的 1~2 倍
如果設置過多的線程,實際上并不會起到很好的效果。此時假設我們設置的線程數是 CPU 核心數的 2 倍以上,因為計算機的任務很重,會占用大量的 CPU 資源,所以這是 CPU 每個核心都是滿負荷工作,而設置過多的線程數,每個線程都去搶占 CPU 資源,就會產生不必要的上下文切換,反而會造成整體性能的下降。
?
2. IO密集型
第二種任務是耗時 IO 型,比如數據庫、文件的讀寫,網絡通信等任務,這種任務的特點是并不會特別消耗 CPU 資源,但是 IO 操作很耗時,總體會占用比較多的時間。
對于這種情況任務最大線程數一般會大于 CPU 核心數很多倍,因為 IO 讀寫速度相比于 CPU 的速度而言是比較慢的,如果我們設置過少的線程數,可能導致 CPU 資源的浪費。而如果我們設置更多的線程數,那么當一部分線程正在等待 IO 的時候,它們此時并不需要 CPU 來計算,那么另外的線程便可以利用 CPU 去執行其他的任務,互不影響,這樣的話在任務隊列中等待的任務就會減少,可以更好地利用資源。
?
3. 通用公式
通過這個公式,我們可以計算出一個合理的線程數量,如果任務的 IO 耗時時間長,線程數就隨之增加,而如果CPU 耗時長,也就是對于我們上面的 CPU 密集型任務,線程數就隨之減少。
太少的線程數會使得程序整體性能降低,而過多的線程也會消耗內存等其他資源,所以如果想要更準確的話,可以進行壓測,監控 JVM 的線程情況以及 CPU 的負載情況,根據實際情況衡量應該創建的線程數,合理并充分利用資源。
?
4. 結論
綜上所述我們就可以得出以下結論:
線程的 CPU 耗時所占比例越高,就需要越少的線程
線程的 IO 耗時所占比例越高,就需要越多的線程
針對不同的程序,進行對應的實際測試就可以得到最合適的選擇
線程數 >= CPU 核心數
總結
以上是生活随笔為你收集整理的线程池应该设置多少核心线程数——Java多线程系列学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单易懂,ThreadPoolExecu
- 下一篇: java美元兑换,(Java实现) 美元