深入解析Java Timer源码机制

Java定时器Timer源码详解

Java中的Timer类用于在后台线程中安排任务执行,支持一次性或重复执行。以下从源码角度分析其实现原理。

Timer类核心结构

Timer类主要依赖两个核心组件:TaskQueueTimerThreadTaskQueue是一个优先级队列,用于存储待执行的任务;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();
    }
}

任务执行线程

TimerThreadTimer的核心执行线程,不断从队列中获取任务并执行。如果队列为空,线程会等待;如果获取到任务但未到执行时间,线程会休眠至执行时间。

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) {}
    }
}

关键设计要点

  1. 线程安全:通过synchronized关键字确保队列操作和任务状态修改的原子性。
  2. 优先级队列:使用二叉堆实现的优先级队列,保证任务按时间顺序执行。
  3. 延迟控制:通过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

#牛客AI配图神器#

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务