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之后,会进行等待的时间(这期间如果没有信号通知它的话)
- ...
togglePause方法
QuartzShedulerThread对象在实例化的时候,此时就处于paused状态(paused为ture)。为什么实例化的时候就处于paused状态呢,因为如果此时没有对应的触发器和Job加入到JobStore的话,QuartzShedulerThread执行主逻辑会占用和消耗资源(比如锁的抢占,无效的查询等)。
那么什么时候QuartzShedulerThread才不处于paused状态呢?我们查看源码可知,在quartzSheduler准备好需要对应的资源后,并且在它的start方法调用的时候,quartzSheduler就会调用QuartzShedulerThread的togglePause方法。不知道细心的小伙伴有没有发现,quartzSheduler的start方法,就是对应设计模式中的外观模式。togglePause逻辑如下:
- 获取sigLock锁。
- 设置paused为传入的值。
- 如果传入的值为false,则通知所有等待在sigLock上的线程。
- 如果传入的值为true。
- 设置signaled为true。
- signaledNextFireTime为0。
- 通知所有等待在sigLock上的线程。
halt方法
在quartzScheduler停止的时候会调用quartzSchedulerThread的halt方法,也就是去修改quartzSchedulerThread的循环标志halted为false。halt方法逻辑如下:
- 获取sigLock锁。
- 设置halted为true。
- 判断当前quartzSchedulerThread是否处于paused状态,如果处于paused状态就直接通知等待在该sigLock锁上的所有线程。
- 如果不处于paused状态,那么就需要通知quartzSheduler的主处理逻辑发生重大变化,此时signaled为true, signaledNextFireTime时间为0。
- 如果传入的wait值为true,会调用quartzSchedulerThread的join方法。(也就是需要把当前线程执行完毕,调用者线程才能继续执行。)
run方法
run方法是quartzSchedulerThread的主处理逻辑。它的方法逻辑如下:
- 首先是一个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)。
博主微信公众号

quartz框架(十)-QuartzShedulerThread的更多相关文章
- Quartz 框架 教程(中文版)2.2.x
Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架 Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介 Quar ...
- Quartz框架(第一版)
任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...
- Quartz框架
Quartz框架 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz 允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和触发器的多 ...
- 【淘淘】Spring整合Quartz框架
我在外面工作实习的时候,我们做的项目是一个日报子系统,也就是定时定点为公司生成一些报表数据还有一些数据反馈.这时候我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.当时,我做 ...
- java任务调度quartz框架的小例子
quartz是一个开源的作业调度框架,当然,java可以使用Timer来实现简单任务调度的功能,但Timer是单线程的设计方案,使得一个任务延迟会影响到其他的任务.java也可以使用Scheduled ...
- Quartz框架简介
一.Quartz概述: Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间.其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高 ...
- [译]Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架
第一课:开始使用Quartz框架 在你使用调度器之前,需要借助一些具体的例子去理解(谁愿意只是猜啊?).你可以使用SchedulerFactory类来达到程序调度的目的.有一些Quartz框架的用户可 ...
- Spring框架下的定时任务quartz框架的使用
手头的这个项目需要用到定时任务,但之前没接触过这东西,所以不太会用,从网上找资料,大致了解了一下,其实也不难.Java的定时任务实现有三种,一种是使用JDK自带的Timer那个类来实现,另一种是使用q ...
- Quartz框架学习(1)—核心层次结构
Quartz框架学习 Quartz(任务调度)框架的核心组件: job:任务.即任务调度行为中所要调度的对象. trigger:触发器.是什么促使了一个任务的调度?当然是时间.这也算事件驱动类型程序. ...
随机推荐
- SpringAOP/切面编程示例
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11833954.html Spring AOP/切面编程实例和一些注意事项, 主要是利用注解来实 ...
- Failed to connect to raw.githubusercontent.com 443 解决方案
wget 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid ...
- 震惊!!!!!!!靠sort水过二叉堆的天秀操作
- 求解Ax=b
一 线性方程组 Ax=b 的解释 线性方程组 Ax=b,其中矩阵 A 尺寸为 m*n, 当 A 为方正时,可使用消元法判断解是否存在并求解.当 A 为长方形矩阵时,同样可使用消元法判断解存在情况并求解 ...
- Note -「动态 DP」学习笔记
目录 「CF 750E」New Year and Old Subsequence 「洛谷 P4719」「模板」"动态 DP" & 动态树分治 「洛谷 P6021」洪水 「S ...
- Solution -「ARC 082D」Sandglass
\(\mathcal{Description}\) Link. 一个沙漏内共 \(Xg\) 沙,令初始时上半部分为 A,下半部分为 B.沙漏在 \(r_1,r_2,\cdots,r_n\) 时 ...
- 论文解读(DAEGC)《Improved Deep Embedded Clustering with Local Structure Preservation》
Paper Information Title:<Attributed Graph Clustering: A Deep Attentional Embedding Approach>Au ...
- python3监控网站状态
前面已经写过Python3发邮件,Python发微信的文章了.直接导入即可. import configparser,requests from time import sleep import We ...
- jmeter非gui之shell脚本
非gui运行脚本,如果目录非空,会报不能写的错 可以通过shell脚本来处理: #!/bin/bash filename=`date +'%Y%m%d%H%M%S'` if [ -d /root/te ...
- ASP.NET Core 6框架揭秘实例演示[12]:诊断跟踪的进阶用法
一个好的程序员能够在系统出现问题之后马上定位错误的根源并找到正确的解决方案,一个更好的程序员能够根据当前的运行状态预知未来可能发生的问题,并将问题扼杀在摇篮中.诊断跟踪能够帮助我们有效地纠错和排错&l ...