下面是“Java定时器Timer的源码分析”的完整攻略。
一、概述
java.util.Timer
是一个简单的线程定时器,它允许您在未来一个指定的时间段内执行单个或重复的任务。
Timer 的 API 相对简单,但是它是在单线程中运行的。因此,如果一个任务的执行时间很长,那么以后所有任务的执行都将受到影响。
Timer 类仅仅用于在一个线程中顺序执行执行 Runnable 的任务, 如果有多个任务或轮子任务需要执行,则可以考虑使用线程池。
二、源码分析
1. Timer 和 TimerTask
java.util.Timer
类和 java.util.TimerTask
类是 Java 定时器的基础类, Timer 是定时器类, TimerTask 则是执行任务的抽象类。
其中,Timer 负责调度任务,而 TimerTask 负责执行任务。
Timer 会根据 TimerTask 的时间间隔和延时时间在后台线程中计划执行 TimerTask。Timer 的主要方法主要包括:
public void schedule(TimerTask task, long delay)
:在指定的延迟(以毫秒为单位)后安排指定的任务。此时任务只会执行一次。public void schedule(TimerTask task, long delay, long period)
:在指定的延迟(以毫秒为单位)后安排指定的任务,然后按指定的间隔时间重复执行。即使任务的执行结果不需要使用,此时也必须使用此方法。public void scheduleAtFixedRate(TimerTask task, long delay, long period)
:在指定的延迟(以毫秒为单位)后安排指定的任务,然后按指定的既定速率重复执行。
TimerTask 类的主要方法如下:
public void run()
:任务要执行的操作在此方法中实现。public boolean cancel()
:取消此任务。如果任务已经被调度或正在执行,则返回 false。否则返回 true。public long scheduledExecutionTime()
:返回此任务将要执行的时间。
2. Timer 类的相关属性
Timer 类中有两个相关属性,如下:
-
private final TaskQueue queue = new TaskQueue()
:一个优先级队列,按时间排序。它存储所有准备运行的 TimerTask。 -
private final TimerThread thread = new TimerThread(queue)
:TimerThread 是一个后台线程,他在读取队列中任务并调度他们。
3. TimerThread 类
TimerThread 是一个直接继承 Thread 类的内部类,其 run() 方法重复执行一个死循环来处理队列中的 TimerTask。
TimerThread 主要方法如下:
-
void schedule(TimerTask task)
:调度任务,将其加入队列中。 -
void remove(TimerTask task)
:从队列中移除任务。 -
private void mainLoop()
:死循环读取队列中任务,然后调用 TimerTask 的 run() 方法。
三、示例
下面是两个使用示例:
示例一:
下面的 Java 成员方法演示了如何使用 Timer 通过计划任务来重复执行代码。
public void runTimer() {
Timer timer = new Timer();
TimerTask task = new TimerTask() {
public void run() {
System.out.println("Hello from Timer!");
}
};
timer.schedule(task, 0L, 1000L);
}
这个程序利用 Timer 和 TimerTask 安排任务。代码将打印“Hello from Timer!”的消息,每 1000 毫秒一次。
示例二:
下面的 Java 成员方法演示了如何使用 Timer 和 TimerTask 将程序计划在未来指定的时间运行一次。
public void runTimer() {
System.out.println("Main thread: Starting the timer at "+new Date());
Timer timer = new Timer();
TimerTask task = new TimerTask() {
public void run() {
System.out.println("Other thread: Hello from TimerTask at "+new Date());
}
};
timer.schedule(task, 5000L); // Run the task in 5 seconds
}
这个程序使用 Timer 和 TimerTask 安排任务,在 5 秒后打印“Hello from TimerTask”。
四、总结
Java 提供了简单易用的定时器实现, Timer 可以在未来指定的时间段内执行单个或重复的任务。但是,需要注意 Timer 这个类只适用于在单线程中运行的场景,如果有多个任务或轮子任务需要执行,则可以考虑使用线程池。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java定时器Timer的源码分析 - Python技术站