常见的定时器实现方式有两种:git

  • 最小堆
  • 时间轮

最小堆插入操做的时间复杂度是O(logn),好比ScheduledThreadPoolExecutor的DelayedWorkQueue,而时间轮的实现,插入只须要o(1),在到期删除时的时间复杂度也是o(1)github

KZlN5j.png

时间轮又分为单层和多层,多层主要解决时间溢出问题,也能够用单轮多圈的实现,这里用golang写了一个单轮多圈的实现,测试代码...golang

KZJCXq.png

这里生成了一个最小时间刻度为100ms、有1024个槽的时间轮, tw.AddScheduleTask 表示添加一个定时任务,测试结果为:测试

KZJZh4.png

其它也没啥写的...具体看源码和测试代码吧...3d

源码地址:Githubcdn