线程池参数配置
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: +160L, // 空闲线程存活时间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跟核心线程的使用率动态调整