java線程池如何合理的設置大小
阿新 • • 發佈:2018-01-23
增加 混合 時間 帶來 核心數 次數 java線程 線程數 分配
下面舉個例子:
比如平均每個線程CPU運行時間為0.5s,而線程等待時間(非CPU運行時間,比如IO)為1.5s,CPU核心數為8,那麽根據上面這個公式估算得到:((0.5+1.5)/0.5)*8=32。這個公式進一步轉化為:
最佳線程數目 = (線程等待時間與線程CPU時間之比 + 1)* CPU數目 3、混合型
線程池究竟設置多大要看你的線程池執行的什麽任務了,CPU密集型、IO密集型、混合型,任務類型不同,設置的方式也不一樣
任務一般分為:CPU密集型、IO密集型、混合型,對於不同類型的任務需要分配不同大小的線程池
1、CPU密集型
盡量使用較小的線程池,一般Cpu核心數+1
因為CPU密集型任務CPU的使用率很高,若開過多的線程,只能增加線程上下文的切換次數,帶來額外的開銷
2、IO密集型
方法一:可以使用較大的線程池,一般CPU核心數 * 2
IO密集型CPU使用率不高,可以讓CPU等待IO的時候處理別的任務,充分利用cpu時間
方法二:線程等待時間所占比例越高,需要越多線程。線程CPU時間所占比例越高,需要越少線程。下面舉個例子:
比如平均每個線程CPU運行時間為0.5s,而線程等待時間(非CPU運行時間,比如IO)為1.5s,CPU核心數為8,那麽根據上面這個公式估算得到:((0.5+1.5)/0.5)*8=32。這個公式進一步轉化為:
最佳線程數目 = (線程等待時間與線程CPU時間之比 + 1)* CPU數目 3、混合型
可以將任務分為CPU密集型和IO密集型,然後分別使用不同的線程池去處理,按情況而定
java線程池如何合理的設置大小