spring线程池 ThreadPoolTaskExecutor 配置
所属分类 spring
浏览量 40
ThreadPoolTaskExecutor 是 Spring 框架提供的线程池实现,
它是对 Java 原生 ThreadPoolExecutor 的封装,便于在 Spring 环境中使用
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
核心参数
corePoolSize (核心线程数)默认值:1
线程池中保持的最小线程数,即使这些线程处于空闲状态
maxPoolSize (最大线程数)默认值:Integer.MAX_VALUE
线程池中允许的最大线程数
queueCapacity (队列容量)默认值:Integer.MAX_VALUE
任务队列的容量,当核心线程都在忙时,新任务会进入队列
keepAliveSeconds (线程空闲时间)默认值:60秒
当线程数超过核心线程数时,多余的空闲线程在终止前等待新任务的最长时间
allowCoreThreadTimeOut (允许核心线程超时) 默认值:false
是否允许核心线程超时终止
其他重要配置
threadNamePrefix (线程名前缀) 默认值:"task-"
为线程池中的线程设置名称前缀,便于监控
waitForTasksToCompleteOnShutdown (等待任务完成关闭) 默认值:false
是否等待所有任务完成后再关闭线程池
awaitTerminationSeconds (等待终止时间) 默认值:0
等待任务完成的超时时间(秒),需与waitForTasksToCompleteOnShutdown=true配合使用
rejectedExecutionHandler (拒绝策略)默认值:AbortPolicy
当线程池和队列都满时如何处理新任务
配置示例
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("my-task-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
executor.initialize();
return executor;
}
拒绝策略选项
AbortPolicy (默认):直接抛出RejectedExecutionException异常
CallerRunsPolicy:由调用线程处理该任务
DiscardPolicy:直接丢弃任务,不抛出异常
DiscardOldestPolicy:丢弃队列中最老的任务,然后尝试重新执行当前任务
最佳实践建议
根据系统CPU核心数设置合理的线程数
对于IO密集型任务,可以设置较大的线程数
对于CPU密集型任务,线程数不宜过多
合理设置队列容量,避免内存溢出
生产环境建议设置线程名前缀和合理的拒绝策略
上一篇
下一篇
美国简史
欧洲简史
王安石 与 司马光
Apache Bench (ab) 性能测试
《财富与周期:宏观经济第一课》笔记
MySQL8 JSON 使用