【Java学习】定时器Timer(源码详解)。

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];
    }
}
工作
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值