JDK中集成了简单的定时任务池(ScheduledThreadPool)提供了最简单的任务调度。
Netty中则给出了另一种任务池的实现(Timer)。
1. Timer
定时器。也是调度池的核心(为每一个任务设置一个定时器,当定时过期以后就触发任务执行。)
在jdk中 DougLea使用了以 “最小堆”为数据结构定时器来实现了 ScheduledThreadPoolExecutor 。
而Netty中,使用了 George Varghese and Tony Lauck 论文提供的Hash结构的定时器。
这两种各有什么优劣?
1.1 定时器实现方式
首先定时器需要模拟一个时间流逝的过程(本质是模拟task过期,然后执行)。
一般来说有2种方式模拟:
-
直接法 : 拟定一个时间尺度interval (比如50 ms) 把它当作时钟tick的最小单位。每经过一个tick ,时钟就向后滚动interval,然后减少所有Timer的生命周期,若Timer过期,则执行task。
-
顺序队列: 所有的Timer都需要按照过期时间由近到远排列为一个list。list的头节点是最近过期的Timer。
两种方案的对比:
参考
https://www.lenshood.dev/2021/01/27/java-varhandle/#opaque
https://gee.cs.oswego.edu/dl/html/j9mm.html#summarysec