时间复杂度 O(log(n)) 因为它们使用的 是 最小堆的对排序,每当有新任务的时候都需要堆堆进行插入, 堆排序插入的时间复杂度为 O(log(n))
- 如果任务执行时间过长,TimerTask会出现延迟执行的情况。比如,第一任务在1000ms执行了4000ms,第二个任务定时在2000ms开始执行。这里由于第一个任务要执行4000,所以第二个任务实际在5000ms开始执行。这是由于Timer是单线程,且顺序执行提交的任务
- 如果执行任务抛出异常,Timer是不会执行会后面的任务的
实现方式 | 加入任务 | 取消任务 | 运行任务 |
---|---|---|---|
基于排序链表 | O(n) | O(1) | O(1) |
基于最小堆 | O(lgn) | O(1) | O(1) |
TimeWheelService instance = TimeWheelService.instance;
System.out.println(" start:"+new Date());
instance.schedule(new Runnable() {
@Override
public void run() {
System.out.println("task1 start:"+new Date());
// throw new RuntimeException("aaa");
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},1000);
instance.schedule(new Runnable() {
@Override
public void run() {
System.out.println("task2 start:"+new Date());
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},2000);
根据George Varghese 和 Tony Lauck 1996 年的论文 Hashed and Hierarchical Timing Wheels: data structures to efficiently implement a timer facility
linux 定时器,游戏buffer
实现方式 | 加入任务 | 取消任务 | 运行任务 |
---|---|---|---|
基于排序链表 | O(n) | O(1) | O(1) |
基于最小堆 | O(lgn) | O(1) | O(1) |
基于时间轮 | O(1) | O(1) | O(1) |
参考资料: