quartz框架(十)-QuartzShedulerThread
QuartzSchedulerThread
本篇博文,博主将介绍QuartzSchedulerThread的相关内容。话不多说,直接进入正题。
什么是QuartzSchedulerThread?
从源码和该类的名称上,QuartzSchedulerThread首先是一个线程类,因此它继承了Thread类。从这一点上看,代码的自解释性非常重要。
从quartz框架整体上而言,QuartzSchedulerThread相当于管理者线程,它从JobStore中获取需要触发的任务,交给ThreadPool线程池去分配。接着ThreadPool线程池则会从空闲的工作者线程集合中选取一个工作者线程,把任务分配给该线程执行。
属性定义
- qs,QuartzScheduler对象的引用
- qsRsrcs,QuartzSchedulerResources对象的引用
- sigLock,信号锁
- signaled,是否有信号
- signaledNextFireTime,信号通知后的下一次触发时间
- paused,是否暂停
- halted,是否停止
- random,随机数
- idleWaitTime,空闲等待时间,也就是QuartzShedulerThread在处理完一批Job之后,会进行等待的时间(这期间如果没有信号通知它的话)
- ...
【quartz框架(十)-QuartzShedulerThread】那么什么时候QuartzShedulerThread才不处于paused状态呢?我们查看源码可知,在quartzSheduler准备好需要对应的资源后,并且在它的start方法调用的时候,quartzSheduler就会调用QuartzShedulerThread的togglePause方法。不知道细心的小伙伴有没有发现,quartzSheduler的start方法,就是对应设计模式中的外观模式。togglePause逻辑如下:
- 获取sigLock锁。
- 设置paused为传入的值。
- 如果传入的值为false,则通知所有等待在sigLock上的线程。
- 如果传入的值为true。
- 设置signaled为true。
- signaledNextFireTime为0。
- 通知所有等待在sigLock上的线程。
- 获取sigLock锁。
- 设置halted为true。
- 判断当前quartzSchedulerThread是否处于paused状态,如果处于paused状态就直接通知等待在该sigLock锁上的所有线程。
- 如果不处于paused状态,那么就需要通知quartzSheduler的主处理逻辑发生重大变化,此时signaled为true, signaledNextFireTime时间为0。
- 如果传入的wait值为true,会调用quartzSchedulerThread的join方法。(也就是需要把当前线程执行完毕,调用者线程才能继续执行。)
- 首先是一个while循环,循环标记是halt。这个是线程长时间运行的处理套路。
- 判断当前是否处于paused状态,并且halt为false。如果是的话,则需要进行有条件等待( sigLock.wait(1000L))。
- 如果此时从sigLock唤醒时,halted值为false,那么应该直接跳出循环,
- 接着阻塞式的获取线程池中可用的空闲线程数。如果可用线程数大于0才继续执行。
- 接着从JobStore中获取一定时间范围内(now+idleWaitTime)的触发器。
- 如果触发器个数大于0,则获取trigger集合的第一个元素,然后阻塞式判断它的下一次触发时间与当前时间之差是否少于2毫秒。
- 如果小于2毫秒的话,判断当前quartzSchedulerThread是否处于halted状态。
- 如果当前不处于halted状态,则调用对应JobStore的triggersFired方法。
- 接着实例化JobRunShell,并传入线程池进行分配。
- 最后quartzSchedulerThread就进行有时间的等待(随机等待一个时间,时间值小于idleWaitTime)。
文章图片
推荐阅读
- mysql|搭建SSM框架并实现增删查改功能
- 框架|用eclipse开发工具,maven进行包管理,整合SSH框架
- 《手把手教你》系列基础篇(七十七)-java+|《手把手教你》系列基础篇(七十七)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试- 上篇(详解教程)
- 二进制转化为十进制算法原理
- 蓝桥杯历届试题|第十一届蓝桥杯 ——子串分值和
- 蓝桥杯历届试题|第十一届蓝桥杯 ——限高杆
- Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
- 戏说领域驱动设计(十五)——内核元素
- 软件测试|Jmeter+Ant+Jenkins接口自动化测试框架搭建for Windows
- flutter学习|Dart语言Future、async、await异步(十)