一 JAVA线程池的线程数量配置
关于线程的配置,线程数量配置多少这个问题呢?往往不同的环境与不同的线程中的代码决定其配置的线程的数量。
二 常见的线程量配置
最常见的方式根据线程中处理的代码划分为CPU密集型或IO密集型:
- CPU密集型: 线程池中配置的线程数量 = cpu核数量
- IO密集型就 : 线程池中配置的线程数量 = cpu核数量 * 2
这就是所谓的通用配置方法,合理吗?其实我们可以能过调试可以很好知道是否合理。
三 根据情况配置最佳线程数量
以下是创建一个线程池的代码:
private static ExecutorService createThreadPool() {ThreadPoolExecutor threadPool = new ThreadPoolExecutor(32, 100,60L, TimeUnit.SECONDS,new ArrayBlockingQueue<>(1000));threadPool.setThreadFactory(new ThreadFactory() {private final AtomicInteger counter = new AtomicInteger(1);@Overridepublic Thread newThread(Runnable r) {return new Thread(r, "test cpu-" + counter.getAndIncrement());}});return threadPool;}
这里核心数,也就是线程的数最设置成32,但我本地的环境的cpu是8核的开发机
使用jdk自带的调式工具jvisualvm.exe 如下图:
打开运行后的效果图:
说明:
按本地开发机的8核cpu如果按上面的公式应该设置16核才合理,但现在要设置成32个线程数量才全理,如果设置成16线程,并发在11:50:45时就不够用并且要串联等待,而整体cpu占用还是非常的小,还有比较大的设置空间,这里每个线程是设备状态通知相关商家的http请求,如果后续商家继续增加这里可以结合线程所占用的空闲比,可以继续优化加大线程量。
四 总结
线程池的数量设计多少,应结合代码与所运行环境情况配置其运行数量。