Java的Timer类
1、具体概念
Timer
类是 Java 中用于计划任务的工具类,它可以在后台线程中定时执行任务或延迟执行任务。Timer
类配合 TimerTask
使用,适合用于需要在指定时间执行一次任务或周期性地执行任务的场景。TimerTask
表示由 Timer
调度的一个任务,用户需要继承 TimerTask
类并重写其 run()
方法来定义任务的具体内容。
2. Timer类的常用方法
构造方法
Timer()
: 创建一个新的 Timer
,它通过后台线程来调度任务。
Timer(boolean isDaemon)
: 创建一个指定是否为守护线程的 Timer
。当 isDaemon
为 true
时,定时器线程是守护线程;否则,它是用户线程。
常用方法:
void schedule(TimerTask task, long delay)
: 安排一个任务在指定的**延迟(毫秒)**后执行一次。
void schedule(TimerTask task, Date time)
: 安排一个任务在指定的日期和时间执行一次。
void schedule(TimerTask task, long delay, long period)
: 安排一个任务在指定延迟后开始执行,并以固定的时间间隔重复执行。
void scheduleAtFixedRate(TimerTask task, long delay, long period)
: 安排一个任务在指定延迟后开始执行,并以固定速率重复执行。
void cancel()
: 终止所有已安排的任务,停止 Timer
,释放相关资源。
3. TimerTask类的用法
TimerTask
是一个抽象类,用于封装任务的逻辑。使用时需要继承 TimerTask
并重写 run()
方法。
import java.util.Timer;
import java.util.TimerTask;
public class TimerExample {
public static void main(String[] args) {
Timer timer = new Timer(); // 创建Timer实例
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("任务执行: " + System.currentTimeMillis());
}
};
long delay = 1000; // 1秒后执行
long period = 2000; // 每2秒执行一次
timer.schedule(task, delay, period);
// 5秒后停止定时器
new Timer().schedule(new TimerTask() {
@Override
public void run() {
timer.cancel();
System.out.println("定时器已取消");
}
}, 5000);
}
}
在上述示例中,Timer 创建了一个后台线程来调度 TimerTask。task 是一个继承 TimerTask 的匿名内部类,重写了 run() 方法,定义了任务的具体内容。使用 timer.schedule(task, delay, period) 方法,在 1 秒后开始执行任务,并每 2 秒重复一次。5 秒后,通过另一个 Timer 实例安排一个取消操作,停止定时器。
4. schedule() 与 scheduleAtFixedRate() 的区别
schedule(TimerTask task, long delay, long period):
以固定延迟方式调度任务。如果任务执行时间超过了周期时间,会导致后续任务的执行时间被推迟,任务的实际间隔可能会比 period 长。适用于不要求精确执行频率的场景。
scheduleAtFixedRate(TimerTask task, long delay, long period):
以固定速率方式调度任务,不管前一个任务是否完成,后续任务会按照固定的间隔时间调度。
如果任务的执行时间超过了 period,Timer 会尽快补上错过的任务执行次数,避免任务调度时间被累积推迟。适用于对执行频率要求较高的场景。
5. Timer类局限性
单线程调度:Timer 内部使用单个线程来执行所有任务,因此如果一个 TimerTask 执行时间过长,会影响其他任务的执行,导致后续任务的延迟。适合简单任务,不适合需要高并发的场景。
不能捕获的异常:如果 TimerTask 中抛出了 RuntimeException 并未被捕获,则该 Timer 线程会意外终止,导致所有已安排但未执行的任务被取消。
替代方案:对于更复杂的任务调度,可以使用 ScheduledExecutorService,它是 java.util.concurrent 包的一部分,提供了更灵活和强大的调度机制,并且可以支持多线程。
Timer类的常见应用场景
定时执行任务:如每天定时清理过期缓存、日志文件等。
延时任务:在指定时间后执行某个操作,比如延时发送提醒。
周期性任务:如定期检查某些条件、刷新数据、发送心跳等。
6. Timer类与ScheduledExecutorService的对比
虽然 Timer 是定时任务调度的经典方式,但在 Java 的 java.util.concurrent 包中,ScheduledExecutorService 是 Timer 更加推荐的替代品。两者的对比如下:
对于大多数场景,尤其是多任务并行执行的情况,建议使用 ScheduledExecutorService,以获得更好的并发性能和错误处理能力。
原文地址:https://blog.csdn.net/sdg_advance/article/details/143086564
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!