时间轮(TimingWheel)的核心原理
时间轮是一种高效管理定时任务的算法,常用于大数据处理框架(如Kafka、Netty)中。其核心思想是通过环形数组模拟时钟,每个槽位对应一个时间间隔,任务根据到期时间分配到对应槽位。时间轮分为单层和多层结构,单层适用于短周期任务,多层可扩展至长周期场景。
时间轮的指针以固定频率推进(例如每秒一格),触发当前槽位的任务执行。若任务周期超过时间轮总跨度,则通过递归或层级化处理。这种设计将任务调度复杂度从O(n)降至O(1),显著优于传统优先级队列。
时间轮的数据结构实现
以下是一个简化版单层时间轮的Java实现示例,包含核心逻辑:
public class TimingWheel {
private final long tickDuration; // 每个槽位的时间跨度(毫秒)
private final int wheelSize; // 槽位数量
private final long interval; // 总时间跨度 = tickDuration * wheelSize
private final AtomicLong currentTime; // 当前指针位置(毫秒)
private final List<TimerTask>[] buckets; // 槽位数组
// 初始化时间轮
public TimingWheel(long tickDuration, int wheelSize) {
this.tickDuration = tickDuration;
this.wheelSize = wheelSize;
this.interval = tickDuration * wheelSize;
this.currentTime = new AtomicLong(System.currentTimeMillis());
this.buckets = new List[wheelSize];
for (int i = 0; i < wheelSize; i++) {
buckets[i] = new CopyOnWriteArrayList<>();
}
}
// 添加任务
public void addTask(TimerTask task) {
long expiration = task.getExpiration();
if (expiration < currentTime.get() + tickDuration) {
// 立即执行
task.run();
}

被折叠的 条评论
为什么被折叠?



