Java 定时器原理与自定义实现
什么是定时器
定时器在软件开发中扮演着'闹钟'的角色,是一个重要的组件。当达到设定的时间后,它会自动执行某段代码。
常见的应用场景包括:
- 网络通信超时处理:如果对方 500ms 没有返回数据,触发重连逻辑。
- 缓存过期:希望 Map 中的 key 在 3s 后自动删除。
标准库中的 Timer
Java 标准库提供了 java.util.Timer 类,其核心方法是 schedule()。
- 参数说明:第一个参数指定要执行的任务(Runnable),第二个参数指定延迟执行的毫秒数。
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("hello");
}
}, 500);
}
虽然标准库很方便,但理解其底层实现能帮助我们更好地掌握并发编程。下面我们来手动实现一个简易的定时器。
自定义定时器实现思路
核心构成
要实现一个定时器,我们需要以下几个关键部分:
- 带优先级的阻塞队列:用于存放待执行的任务。按任务执行时间排序,队首元素即为即将执行的任务。
- Task 对象:封装 Runnable 任务和预计执行的时间戳。
- 扫描线程:持续监控队列,检查队首任务是否到达执行时间。
逐步实现
1. 定义 Task 类
Task 需要实现 Comparable 接口以便放入优先级队列,同时包含任务逻辑和截止时间。
class MyTask implements Comparable<MyTask> {
private Runnable runnable;
private long time; // 预计执行的时间戳
{
.runnable = runnable;
.time = time;
}
{
time;
}
{
runnable.run();
}
{
Long.compare(.time, o.time);
}
}


