理论知识:
堆:堆是一颗安全二叉树,是一种特殊的树结构,它的每一个节点值都要比父节点要么大,要么小
小顶堆:最小的值放在最上面,每个子节点都比父节点大
大顶堆:最大的值放在最上面,每个子节点都父节点小
完全二叉树:就是要求除了最后一层,其他的每一层的节点都达到最大值;
定时任务和堆有什么关系呢?
实际上每个定时任务的job都对应着堆上的一个节点,如图一个节点代表几分钟,每次取对顶元素执行,每次堆会将最小值放在最上面,这样就更快的执行,而不用去检索
堆的存储:Java中存储二叉树,一种可以选择链表,一种可以选择数组,最终选择数组存储,
堆的插入元素:选择从尾部插入,然后上浮。
删除堆顶元素:删除只能删除对顶元素,如果需要执行就将堆顶取出,然后拿取尾部元素节点(最大的值)放置对顶,进行下沉处理
数组采用的尾插法,如果是头插法会导致所有元素的向后移动,耗费性能时间,小顶堆的特性就是每个节点的值都要比父节点值大,比较父子节点值的大小后 如果不符合就会将新值不停的向上置换,直到满足条件。
二叉树的帮我们维护的节点之间的父
时间轮算法:
一个表盘,每个时间的刻度对应一条链表,链表中存储的是需要执行的定时任务,当钟表开始转动,转动到设定时间后取出链表进行执行。但是也存在问题,如果时间扩展到年月日时分秒时候效率低下
所以引用分层时间轮,月度时间轮:记录几号开始执行,天时间轮:记录几点开始执行, 月轮遍历到了,将任务取出放到天轮中,就可以实现几号几点执行。
corn表达式用的的就是分层时间轮。
QuartZ:
Job:真正执行的业务逻辑写在这里,是给程序员使用的添加自己的需求盒子;每个job会封装成jobDetail,我们一个job可以对应多个jobDetail.
Trigger:触发器,也就是我们定义的触发的时间。有优先级
SimpleTrigger:循环往复的固定时间,或者固定时间间隔去执行。
cronTrigger :按照cron表达式执行定时任务
Scheduler:调度器,基于触发器的设定执行job;