网传 "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左右
这..................