首页  

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 使用