ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[toc] ## Quartz定时任务触发流程 从数据库的角度看: ![](https://img.kancloud.cn/c5/62/c56297e4ebc7e30cfc33cd420b021f54_1596x2199.png) 从代码角度看: ![](https://img.kancloud.cn/eb/f4/ebf4026f44008a265a38497d619391f7_987x1801.png) ## 核心线程 负责任务调度的几个线程: 1.任务执行线程池:通常使用一个线程池(SimpleThreadPool)维护一组线程, 负责实际每个job的执行。 2. Scheduler调度线程`QuartzSchedulerThread` :轮询存储的所有trigger,如果有需要触发的trigger,即到达了下一次触发的时间,则从任务执行线程池获取一个空闲线程,执行与该trigger关联的任务。 3.处理misfire job的线程MisfireHandler:轮训所有misfire的trigger,原理就是从数据库中查询所有下次触发时间小于当前时间的trigger,按照每个trigger设定的misfire策略处理这些trigger。 ### QuartzSchedulerThread源码解读 ``` private QuartzScheduler qs; private QuartzSchedulerResources qsRsrcs; --调度器资源,比如线程池 private final Object sigLock = new Object(); private boolean signaled; private long signaledNextFireTime; private boolean paused; --暂停状态 private AtomicBoolean halted; --中止状态 private Random random = new Random(System.currentTimeMillis()); ``` QuartzScheduler Thread:用来进行任务调度的线程,在初始化的时候paused=true,halted=false,虽然线程开始运行了,但是paused=true,线程会一直等待, 直到start方法将paused置 为false。 ## 参考资料 [quartz定时调度任务触发流程](https://www.processon.com/view/617f66371efad41d03f7e3cf?fromnew=1)