Java定时器Timer源码详解
定时器Timer是Java中用于调度任务在指定时间执行的核心工具类。它允许开发者安排任务在未来的某个时间点执行一次或周期性执行。理解Timer的源码实现有助于更高效地使用它并避免常见陷阱。
Timer类的基本结构
Timer类位于java.util包中,核心依赖一个任务队列(TaskQueue)和一个后台线程(TimerThread)。任务队列基于最小堆实现,确保最早执行的任务始终在队列头部。
public class Timer {
private final TaskQueue queue = new TaskQueue();
private final TimerThread thread = new TimerThread(queue);
}
核心调度方法
Timer提供多个schedule()方法变体,支持延迟执行和周期性执行。以下是最典型的调度逻辑:
private void sched(TimerTask task, long time, long period) {
synchronized(queue) {
if (!thread.newTasksMayBeScheduled)
throw new IllegalStateException("Timer already cancelled");
task.nextExecutionTime = time;
task.period = period;
task.state = TimerTask.SCHEDULED;
queue.add(task);
if (queue.getMin() == task)
queue.notify(); // 唤醒等待线程
}
}
任务队列实现
TaskQueue使用数组实现的最小堆结构,关键操作包括add()和getMin():
class TaskQueue {
private TimerTask[] queue = new TimerTask[128];
private int size = 0;
void add(TimerTask task) {
if (size + 1 == queue.length)
queue = Arrays.copyOf(queue, 2*queue.length);
queue[++size] = task;
fixUp(size); // 堆上浮操作
}
TimerTask getMin() {
return queue[1];
}
}
工作
Java定时器Timer源码详解
定时器Timer是Java中用于调度任务在指定时间执行的核心工具类。它允许开发者安排任务在未来的某个时间点执行一次或周期性执行。理解Timer的源码实现有助于更高效地使用它并避免常见陷阱。
Timer类的基本结构
Timer类位于java.util包中,核心依赖一个任务队列(TaskQueue)和一个后台线程(TimerThread)。任务队列基于最小堆实现,确保最早执行的任务始终在队列头部。
public class Timer {
private final TaskQueue queue = new TaskQueue();
private final TimerThread thread = new TimerThread(queue);
}
核心调度方法
Timer提供多个schedule()方法变体,支持延迟执行和周期性执行。以下是最典型的调度逻辑:
private void sched(TimerTask task, long time, long period) {
synchronized(queue) {
if (!thread.newTasksMayBeScheduled)
throw new IllegalStateException("Timer already cancelled");
task.nextExecutionTime = time;
task.period = period;
task.state = TimerTask.SCHEDULED;
queue.add(task);
if (queue.getMin() == task)
queue.notify(); // 唤醒等待线程
}
}
任务队列实现
TaskQueue使用数组实现的最小堆结构,关键操作包括add()和getMin():
class TaskQueue {
private TimerTask[] queue = new TimerTask[128];
private int size = 0;
void add(TimerTask task) {
if (size + 1 == queue.length)
queue = Arrays.copyOf(queue, 2*queue.length);
queue[++size] = task;
fixUp(size); // 堆上浮操作
}
TimerTask getMin() {
return queue[1];
}
}
1136

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



