Java Timer源码深度解析
Java定时器Timer源码详解
Java中的Timer类是用于在后台线程中调度任务执行的工具,可以安排任务在指定延迟后执行或定期重复执行。以下从源码角度分析其实现原理。
Timer类的基本结构
Timer类位于java.util包中,核心成员变量包括:
TaskQueue:优先级队列,存储待执行任务TimerThread:执行任务的线程nextSerialNumber:生成线程名称的序列号
public class Timer {
private final TaskQueue queue = new TaskQueue();
private final TimerThread thread = new TimerThread(queue);
private static final AtomicInteger nextSerialNumber = new AtomicInteger(0);
}
任务队列TaskQueue
TaskQueue是Timer的核心数据结构,本质是基于数组的优先级堆(最小堆),确保每次取出执行时间最近的任务:
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];
}
}
堆排序通过fixUp()和fixDown()方法维护,确保父节点始终比子节点小。
TimerThread工作原理
TimerThread是实际执行任务的线程,核心逻辑在run()方法中:
private void mainLoop() {
while (true) {
synchronized(queue) {
while (queue.isEmpty() && newTasksMayBeScheduled)
queue.wait();
TimerTask task = queue.getMin();
long currentTime = System.currentTimeMillis();
long executionTime = task.nextExecutionTime;
if (task.cancelled) {
queue.removeMin();
continue;
}
if (executionTime <= currentTime) {
task.run();
if (task.period == 0) {
queue.removeMin();
} else {
reschedulePeriodicTask(task);
}
} else {
queue.wait(executionTime - currentTime);
}
}
}
}
任务调度过程
定时任务通过schedule()方法添加:
private void sched(TimerTask task, long time, long period) {
synchronized(queue) {
task.nextExecutionTime = time;
task.period = period;
task.state = TimerTask.SCHEDULED;
queue.add(task);
if (queue.getMin() == task)
queue.notify();
}
}
对于固定延迟任务(schedule()),执行间隔计算方式为:
nextTime = previousExecutionTime + period
对于固定速率任务(scheduleAtFixedRate()),计算方式为:
nextTime = initialExecutionTime + n*period
关键注意事项
Timer存在单线程执行的局限性,一个任务延迟会影响后续任务。推荐替代方案:
ScheduledThreadPoolExecutor:线程池实现Quartz:企业级调度框架- Spring的
@Scheduled注解
典型使用示例
创建一次性任务:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("Task executed");
}
}, 2000); // 2秒后执行
创建周期性任务:
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("Periodic task");
}
}, 0, 1000); // 立即开始,每秒执行
源码设计要点
- 线程安全通过
synchronized块实现 - 使用
wait/notify机制实现任务唤醒 - 最小堆确保高效获取最近任务
- 任务状态机管理(VIRGIN、SCHEDULED、EXECUTED、CANCELLED)
通过分析源码可见,Timer实现简洁但存在单点故障风险,适合简单场景,复杂场景应考虑更现代的调度方案。
BbS.okane020.info/PoSt/1121_903124.HtM
BbS.okane021.info/PoSt/1121_521013.HtM
BbS.okane022.info/PoSt/1121_743630.HtM
BbS.okane023.info/PoSt/1121_365763.HtM
BbS.okane024.info/PoSt/1121_681469.HtM
BbS.okane025.info/PoSt/1121_323364.HtM
BbS.okane026.info/PoSt/1121_459524.HtM
BbS.okane027.info/PoSt/1121_246364.HtM
BbS.okane028.info/PoSt/1121_466285.HtM
BbS.okane029.info/PoSt/1121_444919.HtM
BbS.okane020.info/PoSt/1121_153323.HtM
BbS.okane021.info/PoSt/1121_352849.HtM
BbS.okane022.info/PoSt/1121_457536.HtM
BbS.okane023.info/PoSt/1121_367268.HtM
BbS.okane024.info/PoSt/1121_625452.HtM
BbS.okane025.info/PoSt/1121_724383.HtM
BbS.okane026.info/PoSt/1121_344668.HtM
BbS.okane027.info/PoSt/1121_762288.HtM
BbS.okane028.info/PoSt/1121_001133.HtM
BbS.okane029.info/PoSt/1121_261357.HtM
BbS.okane030.info/PoSt/1121_366353.HtM
BbS.okane031.info/PoSt/1121_138301.HtM
BbS.okane032.info/PoSt/1121_905548.HtM
BbS.okane033.info/PoSt/1121_887983.HtM
BbS.okane034.info/PoSt/1121_059850.HtM
BbS.okane035.info/PoSt/1121_420939.HtM
BbS.okane036.info/PoSt/1121_124192.HtM
BbS.okane037.info/PoSt/1121_464780.HtM
BbS.okane038.info/PoSt/1121_445775.HtM
BbS.okane039.info/PoSt/1121_442250.HtM
BbS.okane030.info/PoSt/1121_306708.HtM
BbS.okane031.info/PoSt/1121_287064.HtM
BbS.okane032.info/PoSt/1121_700153.HtM
BbS.okane033.info/PoSt/1121_457979.HtM
BbS.okane034.info/PoSt/1121_943469.HtM
BbS.okane035.info/PoSt/1121_025365.HtM
BbS.okane036.info/PoSt/1121_875208.HtM
BbS.okane037.info/PoSt/1121_492230.HtM
BbS.okane038.info/PoSt/1121_497818.HtM
BbS.okane039.info/PoSt/1121_181307.HtM
BbS.okane030.info/PoSt/1121_009871.HtM
BbS.okane031.info/PoSt/1121_346403.HtM
BbS.okane032.info/PoSt/1121_956745.HtM
BbS.okane033.info/PoSt/1121_187773.HtM
BbS.okane034.info/PoSt/1121_148818.HtM
BbS.okane035.info/PoSt/1121_970691.HtM
BbS.okane036.info/PoSt/1121_235302.HtM
BbS.okane037.info/PoSt/1121_373251.HtM
BbS.okane038.info/PoSt/1121_623375.HtM
BbS.okane039.info/PoSt/1121_059907.HtM
BbS.okane030.info/PoSt/1121_307018.HtM
BbS.okane031.info/PoSt/1121_656928.HtM
BbS.okane032.info/PoSt/1121_262674.HtM
BbS.okane033.info/PoSt/1121_038720.HtM
BbS.okane034.info/PoSt/1121_747970.HtM
BbS.okane035.info/PoSt/1121_670232.HtM
BbS.okane036.info/PoSt/1121_273038.HtM
BbS.okane037.info/PoSt/1121_662890.HtM
BbS.okane038.info/PoSt/1121_201809.HtM
BbS.okane039.info/PoSt/1121_465111.HtM
BbS.okane030.info/PoSt/1121_490596.HtM
BbS.okane031.info/PoSt/1121_263070.HtM
BbS.okane032.info/PoSt/1121_680717.HtM
BbS.okane033.info/PoSt/1121_265756.HtM
BbS.okane034.info/PoSt/1121_120332.HtM
BbS.okane035.info/PoSt/1121_948412.HtM
BbS.okane036.info/PoSt/1121_144088.HtM
BbS.okane037.info/PoSt/1121_413648.HtM
BbS.okane038.info/PoSt/1121_671669.HtM
BbS.okane039.info/PoSt/1121_615675.HtM
BbS.okane030.info/PoSt/1121_957614.HtM
BbS.okane031.info/PoSt/1121_867176.HtM
BbS.okane032.info/PoSt/1121_863574.HtM
BbS.okane033.info/PoSt/1121_412512.HtM
BbS.okane034.info/PoSt/1121_597052.HtM
BbS.okane035.info/PoSt/1121_376517.HtM
BbS.okane036.info/PoSt/1121_449802.HtM
BbS.okane037.info/PoSt/1121_361696.HtM
BbS.okane038.info/PoSt/1121_821071.HtM
BbS.okane039.info/PoSt/1121_742174.HtM