ThreadPoolTaskScheduler 完整详解 一、核心介绍ThreadPoolTaskScheduler是 Spring Framework 提供的定时任务线程池调度器基于 JDKScheduledExecutorService封装专门用于Scheduled定时任务底层执行器手动提交延迟任务、周期定时任务支持 Cron、固定间隔、固定延迟多种调度规则集成 Spring 上下文支持 Bean 生命周期管理自动销毁线程池所属包import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;二、核心配置参数常用参数作用推荐配置poolSize核心线程数并发任务最大同时执行数量根据定时任务并发量一般 5~20threadNamePrefix线程名前缀方便日志排查task-schedule-waitForTasksToCompleteOnShutdown容器关闭时等待正在执行任务完成true生产必开awaitTerminationSeconds关闭时最大等待时长60removeOnCancelPolicy取消任务后立即从队列移除释放内存true三、完整配置示例Spring Boot1. Java Config 配置推荐import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import java.util.concurrent.ThreadPoolExecutor; Configuration public class TaskSchedulerConfig { Bean(taskScheduler) public ThreadPoolTaskScheduler threadPoolTaskScheduler() { ThreadPoolTaskScheduler scheduler new ThreadPoolTaskScheduler(); // 核心线程池大小 scheduler.setPoolSize(10); // 线程名称前缀 scheduler.setThreadNamePrefix(schedule-task-); // 关闭时等待任务执行完毕 scheduler.setWaitForTasksToCompleteOnShutdown(true); // 等待超时时间 scheduler.setAwaitTerminationSeconds(60); // 取消任务直接删除 scheduler.setRemoveOnCancelPolicy(true); // 拒绝策略任务满时主线程执行 scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 初始化线程池 scheduler.initialize(); return scheduler; } }2. application.yml 简化仅基础定时自定义池仍需 Beanspring: task: scheduling: pool: size: 10 thread-name-prefix: schedule-task-四、三种任务提交方式方式 1固定延迟任务上一次执行完成后间隔 N 毫秒Autowired private ThreadPoolTaskScheduler taskScheduler; public void scheduleDelayTask() { // 任务实例 Runnable task () - System.out.println(延迟任务执行); // 首次延迟2秒每次执行完间隔5秒 taskScheduler.scheduleWithFixedDelay(task, 2000, 5000); }方式 2固定频率任务严格每隔 N 毫秒执行不等待上一轮结束// 首次延迟1秒每3秒执行一次并发会叠加 taskScheduler.scheduleAtFixedRate(task, 1000, 3000);方式 3Cron 表达式定时任务// 每天凌晨1点执行 taskScheduler.schedule(task, new CronTrigger(0 0 1 * * ?));方式 4一次性延迟任务// 延迟10秒只执行一次 taskScheduler.schedule(task, new Date(System.currentTimeMillis() 10000));五、返回 ScheduledFuture 手动取消任务提交任务会返回ScheduledFuture可随时停止任务ScheduledFuture? future taskScheduler.scheduleWithFixedDelay(task, 1000, 3000); // 取消任务true表示中断正在运行的任务 future.cancel(true);六、和 ThreadPoolTaskExecutor 区别ThreadPoolTaskExecutor普通异步线程池只执行一次性异步方法Async不支持定时调度ThreadPoolTaskScheduler定时专用线程池内置调度能力支持 Cron / 周期 / 延迟任务可同时做普通异步七、常见踩坑点定时任务阻塞线程池大小不足任务执行耗时过长后续任务排队堆积 → 调大poolSize拆分长耗时任务。服务关闭任务丢失未开启waitForTasksToCompleteOnShutdown容器销毁直接杀死运行中任务。多定时任务共用一个调度池 一个任务卡死占用线程所有定时全部停滞可拆分多个独立ThreadPoolTaskSchedulerBean。Cron 任务时区问题 默认系统时区可手动指定时区CronTrigger trigger new CronTrigger(0 0 1 * * ?, TimeZone.getTimeZone(GMT8));八、配合 Scheduled 使用不自定义 Bean 时Spring Boot 自动创建默认ThreadPoolTaskScheduler 自定义 Bean 命名为taskScheduler会自动覆盖默认调度池所有Scheduled统一使用你的线程池。Scheduled(cron 0 */5 * * * ?) public void autoTask() { // 自动使用自定义 ThreadPoolTaskScheduler 执行 }九、关闭线程池容器销毁时ThreadPoolTaskScheduler会自动调用shutdown()无需手动关闭 如需手动停止taskScheduler.shutdown();