工作生活

10 一张图就搞懂spring定时任务

2019-07-02  本文已影响0人  cjxz

直接上图

image.png

spring定时任务是通过JDK的ThreadPoolTaskScheduler实现的。

spring中处理逻辑

java代码逻辑

每一个任务进入ThreadPoolTaskScheduler。不知道大家有没有想过定时任务执行的方式是如何左右定时执行的?假设现在有1000个任务我怎么知道下一个即将执行的定时任务呢?

方案1(不好的实现方式)

通过一个比较小的时间单位,例如1秒钟遍历一次定时任务队列,查看里面那个任务需要执行。这种方案很容易就被否定了。因为如果数据量比较大,每次遍历队列很有可能1秒钟都无法遍历完毕,而且这种时间也不准确。

方案2(优先级队列)

如果学过堆这种数据结构的同学应该知道的最佳实践——优先级队列

堆的定义

分析优先级队列在ThreadPoolTaskScheduler中的使用。在spring中已经创建的Runnable和触发器。每次向队列中添加一个task的时候需要判断滞后时间最小的数据放到堆顶,这样在从队列中获取任务的时候就可以直接拿堆顶(队首)元素判断队首元素执行时间和当前时间对比,如果滞后时间大那么需要将当前线程利用LockSupper工具将当前线程挂起n毫秒,n毫秒到了之后当前线程继续执行,然后调用Runnable接口的run方法。也就是ScheduledMethodRunnable的run方法

上一篇 下一篇

猜你喜欢

热点阅读