ThreadPoolTaskExecutor vs ThreadPoolTaskScheduler 完整对比
一、核心定位区分1. ThreadPoolTaskExecutor普通异步线程池负责一次性异步任务对应注解Async底层ThreadPoolExecutor用途接口异步、后台一次性业务、并发批量处理无定时调度能力2. ThreadPoolTaskScheduler定时调度专用线程池支持周期 / 延迟 / Cron 任务对应注解Scheduled底层ScheduledExecutorService用途定时循环任务、延迟执行、动态 Cron 定时也能执行普通异步二、核心功能对比表对比项ThreadPoolTaskExecutorThreadPoolTaskScheduler核心场景Async 异步执行Scheduled 定时任务、动态定时调度能力无只能提交一次性任务支持 cron、固定频率、固定延迟、一次性延迟核心参数核心线程、最大线程、队列容量、拒绝策略仅 poolSize固定核心线程无最大线程、无阻塞队列底层 JDK 类ThreadPoolExecutorScheduledExecutorService任务叠加有队列缓冲超量触发拒绝策略无队列任务多时并发阻塞线程取消任务无便捷调度句柄返回 ScheduledFuture可随时停止定时任务时区支持不支持Cron 任务可指定时区典型使用批量文件处理、异步通知、接口解耦每日数据统计、定时缓存刷新、轮询巡检三、关键特性详解1. ThreadPoolTaskExecutor 独有特性区分核心线程数、最大线程数、阻塞队列弹性扩容executor.setCorePoolSize(5); executor.setMaxPoolSize(20); executor.setQueueCapacity(100);任务堆积时先放队列队列满再扩容到最大线程仍满执行拒绝策略只适合执行单次 Runnable/Callable不能循环调度2. ThreadPoolTaskScheduler 独有特性只有poolSize固定线程池无扩容机制所有调度任务共用这 N 条线程任务执行慢会排队阻塞后续定时专属调度方法scheduleAtFixedRate固定间隔不等待上一轮完成易并发重叠scheduleWithFixedDelay执行完成后再间隔不会重叠schedule (trigger)Cron 表达式定时支持动态启停定时任务通过ScheduledFuture.cancel()关闭任务四、代码配置示例1. ThreadPoolTaskExecutorAsync 专用Bean(asyncExecutor) public ThreadPoolTaskExecutor asyncExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(8); executor.setMaxPoolSize(16); executor.setQueueCapacity(200); executor.setThreadNamePrefix(async-task-); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; }使用Async(asyncExecutor)2. ThreadPoolTaskSchedulerScheduled 专用Bean(taskScheduler) public ThreadPoolTaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler new ThreadPoolTaskScheduler(); scheduler.setPoolSize(10); scheduler.setThreadNamePrefix(schedule-task-); scheduler.setWaitForTasksToCompleteOnShutdown(true); scheduler.setAwaitTerminationSeconds(60); scheduler.setRemoveOnCancelPolicy(true); scheduler.initialize(); return scheduler; }使用所有Scheduled自动复用该池也可手动提交动态定时五、容易踩坑的区别点定时任务阻塞问题Scheduler 大坑Scheduler 只有固定线程若某个定时任务执行很久会占用线程其他定时全部卡住。 解决耗时定时内部再调用Async交给 ThreadPoolTaskExecutor 执行。能不能混用Scheduler 可以执行普通一次性任务但不推荐Executor完全不能做定时循环任务没有调度 API。容器关闭行为 两者都支持waitForTasksToCompleteOnShutdown优雅等待运行任务结束再销毁。多任务隔离方案轻量快速定时单独 Scheduler耗时业务定时Scheduler 只做调度分发实际逻辑丢给 Async 线程池普通业务异步单独 ThreadPoolTaskExecutor六、快速选型口诀只要异步、一次性任务 →ThreadPoolTaskExecutor需要循环定时、Cron、延迟轮询 →ThreadPoolTaskScheduler系统同时有大量异步 大量定时两个 Bean 分开配置互相隔离互不影响