quartz是怎么执行定时任务的?
quartz的核心线程为QuartzSchedulerThread;
QuartzScheduler为Job的容器,一个Job由Job实现类和Trigger组成。
QuartzSchedulerThread负责执行Trigger已经被firing的任务。
QuartzSchedulerThread线程在什么时候启动?
在QuartzScheduler构建QuartzSchedulerThread时,Thread在构造方法中就调用start()启动线程。
在启动后,默认为暂停状态(通过变量paused来控制), 当调用Scheduler的start()时,
QuartzScheduler通过调用QuartzSchedulerThread的togglePause(false)来notify线程。QuartzSchedulerThread通过循环来等待start
任务是如何别触发的?
在QuartzSchedulerThread中运行中不停的循环。在循环中执行了如下操作
1. 取出下一个需要运行的Trigger。while循环等待。在while中,wait等待。
2. 当时间到了,线程就将任务封装成TriggerFiredBundle。
3. 通过JobRunShellFactory来borrowJobRunShell,借RunShell。JobRunShell是实现runnable接口的。
4. 调用QuartzSchedulerResources中得ThreadPool来执行shell。任务就开始执行。
在默认情况下,ThreadPool的线程个数为10,可以通过在quartz.properties中配置
org.quartz.threadPool.threadCount = 10 来自定同时运行的最大任务数量。
在任务的调度中:
Trigger提供任务下一次执行的时间。
QuartzScheduler作为quartz的最核心,是事件的接受者,和发出者。
QuartzSchedulerThread常驻内存。停停等等地执行定时任务。
JobRunShell为定时任务的具体执行者。
ThreadPool负责执行JobRunShell,执行之后放回ThreadPool,重复利用,提高并发量。