Java线程池的核心参数配置需要根据任务类型(CPU密集型/IO密集型)、硬件资源(CPU核心数、内存)和业务需求综合调整。以下是关键参数的设置原则和推荐值:
1. 核心参数及配置建议
| 参数 | 说明 | 推荐配置 |
|---|---|---|
| corePoolSize | 核心线程数,线程池常驻的最小线程数量 | - CPU密集型:CPU核心数 + 1 - IO密集型:CPU核心数 × 2~4 |
| maximumPoolSize | 线程池允许的最大线程数 | - CPU密集型:corePoolSize + 1 - IO密集型:corePoolSize × 2~4 |
| keepAliveTime | 非核心线程的空闲存活时间 | 默认60秒,IO密集型可适当延长(如120秒) |
| workQueue | 任务队列,用于缓存待执行任务 | - CPU密集型:ArrayBlockingQueue(容量较小) - IO密集型:LinkedBlockingQueue(容量较大) |
| handler | 拒绝策略(当队列和线程池均满时) | 推荐CallerRunsPolicy(由提交任务的线程执行)或自定义日志记录策略 |
2. 任务类型与配置示例
**(1) CPU密集型任务**
-
场景:计算、加密等消耗CPU资源的任务。
-
配置:
int cpuCores = Runtime.getRuntime().availableProcessors(); ThreadPoolExecutor executor = new ThreadPoolExecutor( cpuCores + 1, // corePoolSize cpuCores + 2, // maximumPoolSize 60, // keepAliveTime(秒) TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000), // 容量需限制 new ThreadPoolExecutor.CallerRunsPolicy() );
**(2) IO密集型任务**
-
场景:数据库查询、网络请求等阻塞型任务。
-
配置:
int cpuCores = Runtime.getRuntime().availableProcessors(); ThreadPoolExecutor executor = new ThreadPoolExecutor( cpuCores * 2, // corePoolSize cpuCores * 4, // maximumPoolSize 120, // keepAliveTime(秒) TimeUnit.SECONDS, new LinkedBlockingQueue<>(5000), // 容忍较多排队任务 new ThreadPoolExecutor.DiscardOldestPolicy() );
3. 动态调整与监控
-
动态修改参数:通过
setCorePoolSize()和setMaximumPoolSize()实时调整线程数。 -
监控指标:
- 队列堆积:通过
getQueue().size()监控任务积压。 - 活跃线程数:
getActiveCount()判断线程利用率。
- 队列堆积:通过
4. 注意事项
- 避免无界队列:
LinkedBlockingQueue默认Integer.MAX_VALUE可能导致OOM。 - 拒绝策略选择:高优先级任务需避免直接丢弃(如金融交易场景)。
- 线程命名:通过自定义
ThreadFactory便于日志排查。
通过合理配置上述参数,可以平衡系统资源利用率和任务处理效率。实际场景中建议结合压测结果微调。