Netty 时间轮
2024-04-10 21:21:47 10 举报
Netty 时间轮是一种高效的定时调度器,用于处理大量定时任务,在保持高精度的同时减少系统资源的消耗。它是Netty框架中的一个核心组件,基于双向链表和循环链表的数据结构,将任务调度与执行解耦,具有高效、低延迟和高扩展性的特点。Netty 时间轮广泛应用于分布式系统、网络编程、游戏服务器等领域。
作者其他创作
大纲/内容
timer.taskExecutor.execute(this)使用线程池执行任务
把状态改成 WORKER_STATE_SHUTDOWN
unprocessedTimeouts返回未处理的任务
tick++指向下一个槽位
HashedWheelTimer.HashedWheelBucket#expireTimeouts处理这个槽位的所有任务
算出 deadline 即要执行的时间 - startTime
HashedWheelTimer.HashedWheelTimeout#expire
HashedWheelTimer#newTimeout
HashedWheelTimer.Worker创建一个守护线程,来执行时间轮的运行
添加任务
这就是时间轮的数组,所有操作都是围着这个数组转大小是 2 的 N 次方默认 512 每一个槽都是一个链表
算出这个任务的时间轮槽位,轮数并添加到时间轮中
HashedWheelTimer.Worker#processCancelledTasks处理取消的任务
HashedWheelTimer#stop结束时间轮
timeouts = PlatformDependent.newMpscQueue();使用的是 jctools 的高性能的一个队列多个生产者,一个消费者
HashedWheelTimer.Worker#waitForNextTick等待到下一个时间槽执行的时间
timeouts.poll()
startTimeInitialized.await()一个小细节,只有一个线程才可以设置 startTIme保证一个时间轮只有一个 startTime
如果设置过的情况下判断当前等待的任务数量是否操过 maxPendingTimeouts
当轮数小于等于 0 时才会执行当轮数大于 0 是把轮数 减一
startTime初始化开始时间为当前纳秒值
如果没有指定线程池默认使用ImmediateExecutor单线程阻塞执行
cancelledTimeouts取消的任务都会放到这里
HashedWheelTimer.Worker#processCancelledTasks处理掉已经取消的任务
timeouts.poll()取出还没有进入时间轮的任务
wheel[idx]定位到时间轮的槽位
HashedWheelTimer.HashedWheelBucket#clearTimeouts取出时间轮里面的任务
HashedWheelTimer构造函数
timeouts.add(timeout);添加的任务先存起来
循环发现状态变了
HashedWheelTimeout创建一个执行任务
HashedWheelTimer.Worker#transferTimeoutsToBuckets添加最多 100000 个任务到时间轮的数组中
HashedWheelTimer.HashedWheelBucket#remove把当前任务从链表中取出
HashedWheelTimer#createWheel创建一个数组,保存要执行的任务
HashedWheelTimer#start开启守护进程
时间轮转动起来
在调用HashedWheelTimer#stop前会一直无限循环
startTimeInitialized.countDown()通知其他线程
等待 workerThread 结束
HashedWheelTimer.Worker#run
判断在一个JVM中间有多少个时间轮的实例,最多64个
unprocessedTimeouts都放在这个Set里面
0 条评论
下一页