Quartz的核心元素主要有Scheduler、Trigger、Job、JobDetail。其中
- Scheduler为调度器负责整个定时系统的调度,内部通过线程池进行调度。
那么,你知道quartz的任务是怎么触发的么?往下看你会找到答案
quartz中线程主要分为执行线程和调度线程。
- 执行线程主要由一个线程池维护,在需要执行定时的时候使用SimpleThreadPool就是执行线程SimpleThreadPool创建了一定数量的WorkerThread实例来使得Job能够在线程中进行处理。
- 调度线程:QuartzSchedulerThread也是本章重点要分析的
QuartzSchedulerThread是一个线程类,负责查询并触发Triggers,该线程类的主要工作分为以下几个步骤:
1、等待QuartzScheduler启动
2、查询待触发的Trigger
3、等待Trigger触发时间到来
4、触发Trigger
5、循环上述步骤
首先来看看它的构造方法以及togglePause方法


期中红框出的paused很重要,构造方法中将它初始化为true,由它的togglePause方法进行更改,后文中会分析它的run方法,只有当paused为false时调度线程才真正开始工作,而这需要QuartzScheduler的start方法中调用它的togglePause方法将它的值设置为false。

再来着重分析下run方法

可以看出当paused=true时调度线程此时不会真正开始执行只会在不断循环阻塞,我们接着往下看


取出集合中最早执行的触发器,判断距离执行时间是否大于两毫秒,大于两毫米则阻塞,再往下看

1、根据需要执行的trigger从数据库中获取相应的JobDetail
2、把任务封装成JobRunShell线程任务,然后放到线程池中
3、调用ThreadPool的runInThread方法将Job放入对应的工作线程进行执行Job
接下来就将任务交给执行线程去处理了,整个QuartzSchedulerThread的重要的run方法的介绍就如上,总结一下
1. 首先需要获取线程池中的可用线程数量(若没有可用的线程则会阻塞到有可用的为止);
2. 获取30m内要执行的trigger
3. 取出最先要执行的trigger,待直到在2ms内;
4. 调用jobStore的triggersFired方法
5. 针对每个要执行的trigger,创建JobRunShell,并放入线程池执行: