目录
问题
Java 多线程开发中,一般需要用到线程池,线程池的大小应该如何设置?
如果线程池太小,则无法压榨全部 cpu 性能,线程池太大的话,则过多的上下文切换,反而会起到反效果。
结论
默认:
- CPU密集型:CPU核心线程数 + 1
- IO密集型:CPU核心线程数 * (1 + IO耗时 / CPU耗时)
实际业务场景:
- 根据压测结果来进行微调。一般情况下,保证生产环境为压测环境的75%
正文
程序可以分为CPU密集型和IO密集型。
如果是CPU密集型,有多少个CPU核心线程,线程池大小设置多少个,这样就能够将CPU全部利用起来。但是考虑到线程有可能因为内存页失效或其他原因导致阻塞,多设置一个线程可以保证CPU的利用率。
如果是IO密集型,线程池大小则和IO耗时成正比。IO耗时长,线程更容易阻塞,从而浪费CPU资源。适当增加线程池的线程数,可以提高CPU的利用率。
以上是默认情况下配置,实际的业务场景可以根据压测结果来进行微调。一般情况下,保证生产环境为压测环境的75%。
代码
Java 获取可计算资源数
public class Test {
public static void main(String[] args) {
Runtime.getRuntime().availableProcessors();
}
}