quartz源码分析——执行引擎和线程模型


title: quartz源码分析——执行引擎和线程模型
date: 2017-09-09 23:14:48
categories: quartz
tags: [quartz, 源码分析]



软件版本:quartz-2.2.3oop

上一篇介绍了quartz的启动过程,这篇主要介绍quartz的执线程模型,众所周知,quartz并无采用定时器去完成定时任务,而是经过线程去完成。为了简化对quartz线程模型的理解,就暂用下理解方式吧源码分析

| 类名 | 名词解释 |
|-
| SimpleThreadPool| 工头儿 |
| WorkThread| 工人 |
| QuartzScheduleThread| 老板 |
| JobRunShell | 工做,实现了Runnable|线程

从配置提及

从上述配置文件能够看出quartz配置了一个线程池,实现名称为SimpleThreadPool, 这个线程池做用是什么呢,我把注释写在代码中。code

SimpleThreadPool——quartz里的工头儿

以上是这个类的成员变量,从上面的成员变量能够看出,这个线程池用LinkedList存储执行全部job的工人(Worker),来管理了全部的工人(Worker),那么咱们就叫SimpleThreadPool为工头儿吧,老板要分派任务,确定会找工头儿,工头在找空闲的工人来处理工做。
那工头对老板提供的接口是什么呢,继续往下看blog

上面的runInThread 就是工头对老板提供的对外接口,Runnable就是老板安排的工做,流程是这样的:接口

WorkerThread——quartz里的工人

介绍了工头,再来介绍一下工人,工头儿经过调用work.run方法,工人就开始工做了
开一下代码
文档

工头把任务交给工人,工人线程此时阻塞,当runnable被赋值时,工做线程被唤醒。流程图以下:
get

QuartzSchedulerThread——Quartz里面的老板

QuartzSchedulerThread是quartz里真正负责时间调度的类,这个线程的run方法也是最外层的loop。主要负责任务触发,工做包装,任务批处理的控制,这个方法是本章最难的一个方法了,看一下主loop

boss线程涉及的细节很是多,看一下流程图
源码

上面的流程介绍的差很少了,建议对着代码看流程,有助于理解。it

线程模型图

一图以概之

以上是本身的一家之言,如有错误之处,请不吝赐教,共同提升。

参考文档