Java 中的定时器类Timer详解

目录

1、Java 中的定时器类

2、Timer 类简介

3、Timer 类的实现原理


1、Java 中的定时器类

        Java 中常用的定时器类有以下几种:

  1. Timer 类:Java 提供的最基本的定时器类,使用单个线程按照指定的时间执行任务,适合执行较简单的任务
  2. ScheduledThreadPoolExecutor 类:Java 5 之后新增的类,是一个支持定时与周期性执行任务的线程池。相对于 Timer 类,可以处理更加复杂的定时任务,并且可以控制并发度
  3. ScheduledExecutorService 接口:是 ScheduledThreadPoolExecutor 类的接口,定义了基于时间的调度服务的通用方法,可以通过 Executors 工厂类来创建。
  4. Quartz:是一个开源的、基于 Java 的任务调度框架,可以在指定时间内执行任务。与 Timer 类和 ScheduledThreadPoolExecutor 类相比,Quartz 更加灵活和强大,支持更多的任务调度模式和任务执行方式,适用于复杂的任务调度需求。

2、Timer 类简介

        Timer类用于在指定时间之后执行某些任务,也可以在指定时间间隔内周期性地执行某些任务。它是在JDK 1.3中引入的。

        Timer类提供了三个主要方法:

  • schedule(TimerTask task, Date time):该方法用于在指定时间执行指定的任务。
  • schedule(TimerTask task, long delay):该方法用于在指定延迟时间之后执行指定的任务。
  • scheduleAtFixedRate(TimerTask task, Date firstTime, long period):该方法用于以固定的时间间隔周期性地执行指定的任务。

        在使用Timer类时,我们需要创建一个Timer实例,并将要执行的任务以TimerTask的形式传递给Timer实例的以上三个方法之一。注意,TimerTask是一个抽象类,我们需要继承它并实现其run()方法来定义具体的任务逻辑。

        使用Timer类需要注意以下几点:

  1. Timer类是单线程执行的,如果某个任务的执行时间过长,可能会影响其他任务的执行
  2. Timer类的时间调度是基于系统时间的,如果系统时间被修改,可能会对任务的执行造成影响。
  3. Timer类在异常情况下的处理机制不够健壮,可能会导致一些未知的问题。

        因此,从JDK 1.5开始,Java提供了ScheduledExecutorService接口来替代Timer类,以实现更加健壮和灵活的定时任务调度。

        以下是一个使用 Timer 类的简单示例:

import java.util.Timer;
import java.util.TimerTask;

public class TimerExample {
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println("Task executed at " + System.currentTimeMillis());
            }
        };
        long delay = 5000L;
        timer.schedule(task, delay);
    }
}

        这个示例中,我们创建了一个 Timer 对象,然后定义了一个 TimerTask 对象,该对象表示要执行的任务。在这个任务中,我们只是简单地打印出当前时间。最后,我们调用了 Timer 对象的 schedule() 方法来安排任务在 5 秒后执行。

        注意,Timer 对象是单线程的,这意味着它会在同一个线程中顺序执行所有已安排的任务。如果任务执行时间太长或出现异常,可能会影响 Timer 对象的执行效率,甚至导致整个程序崩溃。因此,Timer 对象不适合执行长时间运行的任务。// 单线程定时任务的致命缺陷

        因此,对于长时间运行的任务,建议使用 ScheduledExecutorService 类来代替 Timer 类

3、Timer 类的实现原理

// 借鉴实现思想

        Timer 类内部基于一个单线程的任务队列来执行任务,其实现原理主要可以分为两个部分:

  1. Timer 对象内部维护了一个有序任务队列。每个任务都有一个到期时间,Timer 对象会按照任务的到期时间排序,将任务插入到有序队列中。
  2. Timer 对象内部有一个线程,该线程会不断地从任务队列中取出最早到期的任务,并执行该任务。当任务执行完毕后,Timer 对象会重新检查任务队列,继续执行下一个最早到期的任务,以此类推。

        在 Timer 类中,使用了 Java 的 wait() 和 notify() 方法来实现任务调度。具体来说,Timer 对象中的线程会通过 wait() 方法来等待下一个任务的到期时间。当有新的任务到期时,Timer 对象会通过 notify() 方法来唤醒等待的线程,让线程执行该任务。// 也实现了线程复用

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swadian2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值