延时任务算法比较
主流工具包与算法
- 小顶堆,时间排序算法
- JDK 的 Timer
- ScheduledThreadPool
- DelayQueue 配合线程池
- 时间轮算法
- netty 实现
- kafka 实现
比较
小顶堆算法
优势:延时时间较精确,简单
劣势:插入和修改复杂度 O(N),存在排序开销
适用场景:少量任务、延迟时间疏散的场景
时间轮算法
优势:插入修改复杂度 O(1),性能较好
劣势:精确度固定,误差较大,不能很好的支持较长延时执行的任务,有固定的线程切换周期,容易导致无意义的线程唤醒(空推进),复杂
适用场景:大量且密集任务,精确度不高,如平均每秒激活30个任务以上
Timer(不推荐使用)
内部维护一个优先队列,根据延迟时间排序,单线程执行。
弊端
-
优先队列的插入和删除的时间复杂度是O(logn),当数据量大的时候,频繁的入堆出堆性能有待考虑。
-
并且是单线程执行,那么如果一个任务执行的时间过久则会影响下一个任务的执行时间(当然你任务的run要是异步执行也行)。