当前位置: 首页 > news >正文

【Netty源码解读和权威指南】第35篇:Netty时间轮HashedWheelTimer源码解析——百万定时任务的秘密

上一篇【第34篇】Netty Selector优化——为什么比JDK NIO快这么多
下一篇【第36篇】Netty时间轮高级应用——10亿级定时任务的工程实践


一、为什么需要时间轮?

方案10万定时任务性能问题
JDK Timer极差单线程,插入O(nlogn)
ScheduledThreadPool一般堆插入O(logn),内存大
HashedWheelTimer优秀插入O(1),内存小

二、时间轮数据结构

tickDuration=100ms, ticksPerWheel=8 ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ ← 8个槽位 └───┴───┴───┴───┴───┴───┴───┴───┘ ↑ ↑ 指针(每100ms移动一格) 每个槽位是链表 时间轮周期 = 8 × 100ms = 800ms 指针指向槽0:执行该槽链表中的所有任务 指针指向槽1:执行该槽链表中的所有任务 ...

三、核心源码

publicclassHashedWheelTimerimplementsTimer{privatefinalWorkerworker=newWorker();privatefinalHashedWheelBucket[]wheel;// 环形数组privatefinalintmask;// wheel.length - 1,用于取模privatefinallongtickDuration;// 每格时间间隔// 添加定时任务 O(1)publicTimeoutnewTimeout(TimerTasktask,longdelay,TimeUnitunit){longdeadline=System.nanoTime()+unit.toNanos(delay)-startTime;HashedWheelTimeouttimeout=newHashedWheelTimeout(this,task,deadline);// 计算槽位longcalculated=deadline/tickDuration;timeout.remainingRounds=(calculated-tick)/wheel.length;intstopIndex=(int)(calculated&mask);// 位运算取模wheel[stopIndex].add(timeout);// O(1)追加returntimeout;}// Worker线程核心循环privatefinalclassWorkerimplementsRunnable{publicvoidrun(){do{longdeadline=waitForNextTick();// 等待到下一个tickintidx=(int)(tick&mask);HashedWheelBucketbucket=wheel[idx];bucket.expireTimeouts(deadline);// 执行到期任务tick++;// 指针前进}while(!shutdown);}}}

四、实战:实现延迟消息

publicclassDelayQueueExample{privatestaticfinalHashedWheelTimertimer=newHashedWheelTimer();publicstaticvoidsendDelayed(Stringmsg,longdelayMs){timer.newTimeout(timeout->{System.out.println("延迟消息到达: "+msg);},delayMs,TimeUnit.MILLISECONDS);}publicstaticvoidmain(String[]args)throwsException{sendDelayed("订单超时取消",5000);sendDelayed("支付超时提醒",10000);Thread.sleep(15000);timer.stop();}}

五、优缺点与适用场景

特性说明
✅ 插入O(1)计算槽位→追加到链表
✅ 内存小只需环形数组+链表
❌ 精度有限受tickDuration影响
❌ 不适合低延迟毫秒级精度够用

适用:心跳检测、超时重试、延迟消息、连接空闲检测


上一篇【第34篇】Netty Selector优化——为什么比JDK NIO快这么多
下一篇【第36篇】Netty时间轮高级应用——10亿级定时任务的工程实践


http://www.jsqmd.com/news/1052140/

相关文章:

  • AI模型部署实战:二元与连续委托策略的性能对比与优化
  • 对称群核函数:从Gelfand对到Zonal球函数的机器学习实践
  • FOC位置环调优实战:基于NXP MCU的P控制器参数整定指南
  • 基于语义一致性的对话去口语化:BiCon-Gate模型原理与工程实践
  • 2026巴中防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水
  • Langchain项目-多功能客服
  • 进化式AI代码生成:策略基因、经验复用与系统架构实践
  • 装过两套大户型的过来人,说说功能沙发和软体家具选哪家好 - 深圳市民HLL
  • NeuroTrace框架:基于推理溯源图的对抗样本检测与可解释性分析
  • 机器学习解析病毒RNA假结动态机制:从分子动力学到药物设计
  • 3个步骤解决网盘限速:LinkSwift下载助手完全指南
  • CircuitJS1 Desktop Mod:三步掌握免费离线电路仿真终极指南
  • 换过3套大户型功能沙发,给大家说说哪些品牌更靠谱 - 深圳市民HLL
  • p053基于Hadoop 的国产电影数据分析与可视化2(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • 基于Rust的静态信息流控制框架Filament设计与实现
  • 无需重训练实现多模型融合:扩散模型去噪对齐原理与实践
  • Ubuntu 20.04 Redis生产级安全加固实战指南
  • 2026宁波漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • BlenderGIS终极指南:5个简单步骤将地理数据变为惊艳3D场景 [特殊字符]
  • 虚拟电厂核心术语表 2026.6
  • 2026宿迁漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • LinkSwift网盘直链下载助手:九大网盘一键解析,告别限速的终极解决方案
  • 3个场景+4个技巧,让你彻底告别Windows窗口尺寸烦恼
  • 基于属性图与时间推理的长对话AI记忆系统设计与实现
  • B站缓存视频转换终极指南:3分钟学会m4s转MP4完整方法
  • 机器学习在弱引力透镜宇宙学中的应用:应对系统误差与分布偏移挑战
  • emWin仿真开发实战:硬件按键模拟与GUI集成调试指南
  • 从灾难性遗忘到概念瓶颈:CI-CBM实现免示例增量学习
  • 2026岳阳防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水
  • 终极macOS炉石传说助手:HSTracker卡组跟踪与游戏分析完整指南