1.底层实际上是一个小顶堆
任务按照执行时间,排列成一个二叉树,根节点任务最先执行。存在列表中,可以通过索引计算快速计算得到它的父节点。(每一节点存的都是一个job)
1.1 插入元素(插入尾部,然后上浮)
完全二叉树插入元素,最后一层从左到右。插入以后,与其父节点进行比较,小了就交换,直到根节点,依次比较
1.2 删除元素
root节点任务被执行,取列表最后一个元素,放到root位置,然后下层,看左子树与右子树谁小,就与谁交换,直到最底层。
2.时间轮算法(分层时间轮)
小顶堆当任务数少的时候,性能还行,当任务数较多时,性能下降。比如今天是30号,31号的任务完全没必要去比较,浪费性能,出现了时间轮算法。
使用多个不同维度的时间轮,比如天轮(记录几点执行),月轮(记录几号执行),从而避免对所有元素的遍历。月轮时间到了,将所有任务取出来,放到天轮里面去执行,Cron表达式就是基于此思想来执行的。(多时间维度的时间轮算法)
3.三种定时任务用法
3.1 timer
缺点:
- 只能在规定间隔多久来执行,不能规定周几
- 单线程,任务会多执行或者提前执行