You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:12:43