深入解析Java Timer源码机制
Java定时器Timer源码详解
Java中的Timer类用于在后台线程中安排任务执行,支持一次性或重复执行。以下从源码角度分析其实现原理。
Timer类核心结构
Timer类主要依赖两个核心组件:TaskQueue和TimerThread。TaskQueue是一个优先级队列,用于存储待执行的任务;TimerThread是执行任务的线程。
private final TaskQueue queue = new TaskQueue();
private final TimerThread thread = new TimerThread(queue);
任务调度流程
当调用schedule()或scheduleAtFixedRate()方法时,任务会被添加到TaskQueue中。队列根据任务的触发时间(nextExecutionTime)进行排序,确保最早执行的任务在队列头部。
private void sched(TimerTask task, long time, long period) {
synchronized(queue) {
if (!thread.newTasksMayBeScheduled)
throw new IllegalStateException("Timer already cancelled");
synchronized(task.lock) {
task.nextExecutionTime = time;
task.period = period;
task.state = TimerTask.SCHEDULED;
}
queue.add(task);
if (queue.getMin() == task)
queue.notify();
}
}
任务执行线程
TimerThread是Timer的核心执行线程,不断从队列中获取任务并执行。如果队列为空,线程会等待;如果获取到任务但未到执行时间,线程会休眠至执行时间。
private void mainLoop() {
while (true) {
try {
TimerTask task;
boolean taskFired;
synchronized(queue) {
while (queue.isEmpty() && newTasksMayBeScheduled)
queue.wait();
if (queue.isEmpty())
break;
long currentTime, executionTime;
task = queue.getMin();
synchronized(task.lock) {
if (task.state == TimerTask.CANCELLED) {
queue.removeMin();
continue;
}
currentTime = System.currentTimeMillis();
executionTime = task.nextExecutionTime;
if (taskFired = (executionTime<=currentTime)) {
if (task.period == 0) {
queue.removeMin();
task.state = TimerTask.EXECUTED;
} else {
queue.rescheduleMin(
task.period<0 ? currentTime - task.period
: executionTime + task.period);
}
}
}
if (!taskFired)
queue.wait(executionTime - currentTime);
}
if (taskFired)
task.run();
} catch(InterruptedException e) {}
}
}
关键设计要点
- 线程安全:通过
synchronized关键字确保队列操作和任务状态修改的原子性。 - 优先级队列:使用二叉堆实现的优先级队列,保证任务按时间顺序执行。
- 延迟控制:通过
wait(timeout)实现精确的延迟执行,避免忙等待。
使用注意事项
- 单线程执行:所有任务在同一个线程中顺序执行,长时间任务会阻塞后续任务。
- 异常处理:任务抛出未捕获异常会导致线程终止,后续任务无法执行。
- 替代方案:Java 5+推荐使用
ScheduledThreadPoolExecutor,提供更好的灵活性和错误处理。
通过分析源码可见,Timer的实现简洁但存在局限性,适合简单的定时任务场景。复杂场景建议使用更现代的调度框架。
BbS.okacop050.info/PoSt/1120_616271.HtM
BbS.okacop051.info/PoSt/1120_406222.HtM
BbS.okacop052.info/PoSt/1120_516471.HtM
BbS.okacop053.info/PoSt/1120_509952.HtM
BbS.okacop054.info/PoSt/1120_508070.HtM
BbS.okacop055.info/PoSt/1120_302482.HtM
BbS.okacop056.info/PoSt/1120_341214.HtM
BbS.okacop057.info/PoSt/1120_906106.HtM
BbS.okacop058.info/PoSt/1120_351291.HtM
BbS.okacop059.info/PoSt/1120_321281.HtM
BbS.okacop060.info/PoSt/1120_666312.HtM
BbS.okacop061.info/PoSt/1120_581858.HtM
BbS.okacop062.info/PoSt/1120_263773.HtM
BbS.okacop063.info/PoSt/1120_330867.HtM
BbS.okacop065.info/PoSt/1120_202527.HtM
BbS.okacop066.info/PoSt/1120_608069.HtM
BbS.okacop067.info/PoSt/1120_662720.HtM
BbS.okacop068.info/PoSt/1120_937720.HtM
BbS.okacop069.info/PoSt/1120_192787.HtM
BbS.okacop070.info/PoSt/1120_164631.HtM
BbS.okacop060.info/PoSt/1120_886691.HtM
BbS.okacop061.info/PoSt/1120_695461.HtM
BbS.okacop062.info/PoSt/1120_317042.HtM
BbS.okacop063.info/PoSt/1120_782590.HtM
BbS.okacop065.info/PoSt/1120_554462.HtM
BbS.okacop066.info/PoSt/1120_556741.HtM
BbS.okacop067.info/PoSt/1120_950103.HtM
BbS.okacop068.info/PoSt/1120_746821.HtM
BbS.okacop069.info/PoSt/1120_841928.HtM
BbS.okacop070.info/PoSt/1120_458951.HtM
BbS.okacop060.info/PoSt/1120_848503.HtM
BbS.okacop061.info/PoSt/1120_446186.HtM
BbS.okacop062.info/PoSt/1120_892492.HtM
BbS.okacop063.info/PoSt/1120_811820.HtM
BbS.okacop065.info/PoSt/1120_026832.HtM
BbS.okacop066.info/PoSt/1120_830150.HtM
BbS.okacop067.info/PoSt/1120_824307.HtM
BbS.okacop068.info/PoSt/1120_325749.HtM
BbS.okacop069.info/PoSt/1120_428457.HtM
BbS.okacop070.info/PoSt/1120_912326.HtM
BbS.okacop060.info/PoSt/1120_233443.HtM
BbS.okacop061.info/PoSt/1120_633799.HtM
BbS.okacop062.info/PoSt/1120_760563.HtM
BbS.okacop063.info/PoSt/1120_372998.HtM
BbS.okacop065.info/PoSt/1120_505827.HtM
BbS.okacop066.info/PoSt/1120_200846.HtM
BbS.okacop067.info/PoSt/1120_738454.HtM
BbS.okacop068.info/PoSt/1120_205467.HtM
BbS.okacop069.info/PoSt/1120_982235.HtM
BbS.okacop070.info/PoSt/1120_137267.HtM
BbS.okacop060.info/PoSt/1120_531896.HtM
BbS.okacop061.info/PoSt/1120_884861.HtM
BbS.okacop062.info/PoSt/1120_648740.HtM
BbS.okacop063.info/PoSt/1120_208775.HtM
BbS.okacop065.info/PoSt/1120_955518.HtM
BbS.okacop066.info/PoSt/1120_887344.HtM
BbS.okacop067.info/PoSt/1120_664876.HtM
BbS.okacop068.info/PoSt/1120_698039.HtM
BbS.okacop069.info/PoSt/1120_290222.HtM
BbS.okacop070.info/PoSt/1120_321880.HtM
BbS.okacop060.info/PoSt/1120_424920.HtM
BbS.okacop061.info/PoSt/1120_593532.HtM
BbS.okacop062.info/PoSt/1120_423303.HtM
BbS.okacop063.info/PoSt/1120_723661.HtM
BbS.okacop065.info/PoSt/1120_921701.HtM
BbS.okacop066.info/PoSt/1120_612754.HtM
BbS.okacop067.info/PoSt/1120_543964.HtM
BbS.okacop068.info/PoSt/1120_729607.HtM
BbS.okacop069.info/PoSt/1120_901758.HtM
BbS.okacop070.info/PoSt/1120_342550.HtM
BbS.okacop060.info/PoSt/1120_271064.HtM
BbS.okacop061.info/PoSt/1120_218451.HtM
BbS.okacop062.info/PoSt/1120_066659.HtM
BbS.okacop063.info/PoSt/1120_387544.HtM
BbS.okacop065.info/PoSt/1120_476552.HtM
BbS.okacop066.info/PoSt/1120_275396.HtM
BbS.okacop067.info/PoSt/1120_669187.HtM
BbS.okacop068.info/PoSt/1120_733290.HtM
BbS.okacop069.info/PoSt/1120_694861.HtM
BbS.okacop070.info/PoSt/1120_085653.HtM