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

TaskQueueTimer的核心数据结构,本质是基于数组的优先级堆(最小堆),确保每次取出执行时间最近的任务:

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);  // 立即开始,每秒执行

源码设计要点

  1. 线程安全通过synchronized块实现
  2. 使用wait/notify机制实现任务唤醒
  3. 最小堆确保高效获取最近任务
  4. 任务状态机管理(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

#牛客AI配图神器#

全部评论

相关推荐

10-13 13:49
南京大学 财务
饿魔:笑死我了,你简直是个天才
点赞 评论 收藏
分享
09-28 22:01
已编辑
广西科技大学 IT技术支持
合适才能收到offe...:找桌面运维?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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