网传 "CPU密集型任务,线程池size应为CPU数+1; IO密集型任务,线程池size应为CPU数/(1-阻塞系数)".
并且,类似的话也出现在<实战Java高并发程序设计> 这本书里.
但是,今天正好做到一个类似的东西,于是乎就测试了一下,很奇怪,结果恰恰相反.
1.环境:
1.1.jdk1.8
1.2.mysql5.6 (数据库位于本地Ubuntu16.04虚拟机中)
1.3.win10 64bit
2.笔记本配置:
.
3.测试数据库表及90万条样例数据:
4.主要程序代码
4.1.当线程池大小=CPU核心数
public static void main(String[] args) {
final ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);
int cpuCount = Runtime.getRuntime().availableProcessors();
ExecutorService threadPool = Executors.newFixedThreadPool(cpuCount);//线程池大小=CPU核心数
long begin = System.nanoTime();
for (int i = 0; i < cpuCount * 2; i++) {
threadPool.submit(new Runnable() {
@Override
public void run() {
UserService userService = ctx.getBean(UserService.class);
boolean login = userService.login("1", "2");// 查询语句: SELECT * FROM `user` ,单词查询耗时约4s
}
});
}
threadPool.shutdown();
while (!threadPool.isTerminated()) {
}
System.out.println("总共耗时:" + BigDecimal.valueOf(System.nanoTime() - begin, 9));
}多次测试,总耗时在32s左右.
4.2.把线程池大小扩大一倍:
ExecutorService threadPool = Executors.newFixedThreadPool(cpuCount * 2);多次测试,总耗时在36s左右
这..................

本文通过实验探讨了不同规模线程池对程序性能的影响。在使用Spring框架与JDK 1.8环境下,针对线程池大小等于CPU核心数与两倍CPU核心数的情况进行了对比测试,发现实际运行结果与常见建议有所出入。
427

被折叠的 条评论
为什么被折叠?



