延时任务算法比较与源码分析

本文对比了小顶堆、时间轮、Timer、ScheduledThreadPool和DelayQueue等延时任务实现方式,分析了各自的优缺点。小顶堆适合少量任务,时间轮适用于大量密集任务,Timer由于性能和单线程问题不推荐使用,ScheduledThreadPool支持多线程但任务数量少时更合适,DelayQueue常配合线程池使用,优化了调度。时间轮算法在Netty和Kafka中有不同的实现和优化。
摘要由CSDN通过智能技术生成

延时任务算法比较

主流工具包与算法

  • 小顶堆,时间排序算法
    • JDK 的 Timer
    • ScheduledThreadPool
    • DelayQueue 配合线程池
  • 时间轮算法
    • netty 实现
    • kafka 实现

比较

小顶堆算法

优势:延时时间较精确,简单
劣势:插入和修改复杂度 O(N),存在排序开销
适用场景:少量任务、延迟时间疏散的场景

时间轮算法

优势:插入修改复杂度 O(1),性能较好
劣势:精确度固定,误差较大,不能很好的支持较长延时执行的任务,有固定的线程切换周期,容易导致无意义的线程唤醒(空推进),复杂
适用场景:大量且密集任务,精确度不高,如平均每秒激活30个任务以上


Timer(不推荐使用)

内部维护一个优先队列,根据延迟时间排序,单线程执行。

弊端
  • 优先队列的插入和删除的时间复杂度是O(logn),当数据量大的时候,频繁的入堆出堆性能有待考虑。

  • 并且是单线程执行,那么如果一个任务执行的时间过久则会影响下一个任务的执行时间(当然你任务的run要是异步执行也行)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值