定时任务相关

JDK

Timer

任务Task,队列TaskQueue
线程安全,不保证实时,定时通过Object.wait()实现。
底层通过单一后台线程顺序执行,若全部任务执行完毕或者所有Timer引用消失,后台线程自动停止。
定时队列以binary heap存储(数组形式),新增的复杂度为O(log n)。
建议以ScheduledThreadPoolExecutor替换,后者执行线程为1时,两者功能相同。
可以通过decoration函数(非具体函数名)进行扩展。

ScheduledThreadPoolExecutor

任务ScheduledFutureTask,队列DelayedWorkQueue
不保证实时,仅确保不早于定时时刻执行,执行时按FIFO顺序。
DelayedWorkQueue采用堆heap实现(与DelayQueue、PriorityQueue类似)。
默认取消的任务不会实时从队列中删除,仅作标记,此功能与Timer一致;可以通过setRemoveOnCancelPolicy设置成即刻删除。
可以通过decoration函数(非具体函数名)进行扩展。

DelayedWorkQueue中,线程通过Leader-Follower模式进行等待(Leader线程等待确定时间,其他无限等待),新增任务时,leader置null,重新选举leader。
DelayQueue(无界BlockingQueue),不允许null元素,底层为PriorityQueue。等待算法为Leader-Follower模式。
PriorityQueue(无界Priority Queue),不允许null元素,基于堆heap(数组)实现,非线程安全(线程安全版本为PriorityBlockingQueue)。offer、poll、remove、add复杂度为O(log n),remove(Object)、contains为线性时间,peek、size、element为常量时间。
PriorityBlockingQueue基于数组binary heap实现。

Quartz

定时扫描任务表。

HashWheelTimer

Netty、Linux内核都在使用。