springboot线程池任务调度类 -- ThreadPoolTaskScheduler介绍(还没细看,看不懂)
springboot中有一个bean,ThreadPoolTaskScheduler,可以很方便的对重复执行的任务进行调度管理;相比于通过java自带的周期性任务线程池ScheduleThreadPoolExecutor,此bean对象支持根据cron表达式创建周期性任务。
下面介绍一下此bean对象如何实现任务调度,以及如何支持基于cron表达式的任务。
一、如何实现任务调度?ThreadPoolTaskScheduler其实底层使用也是java自带的线程池,源码分析如下:
1. 有个成员变量:
2. 此成员变量的初始化:
3. 着重注意红色框中的方法,代码如下:
可以看出,其实也就是初始化了一个指定核心线程数的线程池,任务的调度就是通过此线程池成员变量实现。
二、如何提交基于cron表达式的任务,以及内部原理。
1. 提交任务接口如下:
其中第二个参数Trigger接口有一个实现CronTrigger,CronTrigger的构造函数中:
传入一个cron表达式string,即可创建一个trigger。
2. 基于cron表达式的任务调度原理,回到上文提到的接口,源码如下:
注意红色框中的代码,创建了一个ReschedulingRunnable实例,并调用其中的schedule方法,返回一个Future结果。一起看下ReschedulingRunnable这个类中的schdule方法
可以看出,首先根据cron表达式计算出下一个执行的delay,然后调用线程池的schedule方法,在指定延迟时间后执行当前这个对象的任务,到了执行时间后,
会调用实例本身的run方法,看下在run方法中执行了什么:
在方法第二句中,先执行任务,执行完成后,更新trigger上下文,然后再次调用schedule方法,那么在schedule方法中,又会再次计算下一次的执行时间点,提交下一次的执行任务,如此循环完成任务的调度。
上面的描述中只是说了大概的原理,其实还有些可以深究的地方,比如super.run()这句,如果方法中抛出了异常会不会导致整个任务的中断,无法执行下一次的任务?源码针对这个问题又是如何规避的呢?
有兴趣的人可以根据源码找到答案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!