Quartz重要线程之QuartzSchedulerThread

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,并放入线程池执行:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容