SpringBoot中同时标注@Scheduled(fixedRate=)与@Async注解的方法执行原理及线程池疑问
同时使用@Scheduled和@Async的执行机制解析
我来给你拆解下这个场景的内部逻辑,核心是两个注解的分工协作:
1. 使用的线程池
首先明确:这个方法最终会用**ThreadPoolTaskExecutor**(也就是你配置的@Async对应的异步线程池)来执行具体业务逻辑,而ThreadPoolTaskScheduler只负责定时触发调度,不会参与任务的实际执行。
2. 具体执行流程
咱们一步一步拆解整个过程:
- 第一步:
ThreadPoolTaskScheduler的默认单线程(大小为1),会严格按照fixedRate=1000的配置,每隔1000毫秒触发一次调度,定位到标注了@Scheduled的pullDataFromExternalServer()方法。 - 第二步:当调度线程触发方法时,发现该方法同时标注了
@Async注解,Spring会立刻将这个方法的执行请求转交给ThreadPoolTaskExecutor的异步线程池。 - 第三步:
ThreadPoolTaskExecutor从自身线程池中分配一个空闲线程(如果没有空闲线程,则按照你配置的拒绝策略处理),由这个线程来执行pullDataFromExternalServer()里的业务操作。 - 第四步:调度线程完成任务转交后,会立刻回到自己的调度循环,等待下一个1000毫秒的触发点——它完全不会等待异步任务执行完成。
这就是你能实现同一个定时方法多次调用异步执行的核心原因:调度线程按时触发任务,每次都把任务丢给异步线程池,不管上一次任务是否执行完毕,只要线程池有处理能力,就会并行执行多个任务实例。
举个直观的例子:如果你的业务逻辑需要运行2秒,那么第1秒调度触发第一个任务(由异步线程A执行),第2秒调度触发第二个任务(由异步线程B执行),此时线程A还在运行,两个任务就实现了并行执行,完全符合你的预期效果。
内容的提问来源于stack exchange,提问作者Saajan Kumar Jha
相关产品推荐
相关产品推荐

