1:判断是否IO密集型,还是计算密集型
CPU 密集型任务:线程池大小设置为 availableProcessors()。
I/O 密集型任务:线程池大小可以设置为 availableProcessors() * 2 或更高。
2:获取当前计算机线程数
Runtime.getRuntime().availableProcessors(); 返回值为当前电脑的线程数
如8核16线程
这里的线程指:计算机可并行的线程数目,8核16线程可并行执行16个线程的任务
3:配置线程池
// 初始核心线程数为 CPU 核心数,最大线程数为 CPU 核心数的 2 倍
new ThreadPoolExecutor(
AVAILABLE_PROCESSORS, // 核心线程数
AVAILABLE_PROCESSORS * 2, // 最大线程数 根据IO还是计算密集型填写,IO:*2 CPU: +1
60L, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<>() // 任务队列
);
AVAILABLE_PROCESSORS:第二步查询到的线程数的值
4:正常调用
for (int i = 0; i < 20; i++) {
threadPool.submit(() -> {
try {
System.out.println("Task executed by " + Thread.currentThread().getName());
Thread.sleep(1000); // 模拟任务耗时
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
threadPool:第三步的线程池对象
备注:更高级的还有动态配置,基于CPU跟核心线程的使用率动态调整