Bootstrap

Java定时任务实现方案(一)——Timer

这篇笔记,简单来介绍一下Java如何使用Timer来实现定时任务,以及该方案的优点和缺点。
Timer是JDK自带的类,可以用来实现定时任务。
使用
1.创建定时任务

​ 定义一个实现了java.lang.Runnable接口的类,重写run()方法,在其中编写任务逻辑。

2.创建并启动定时器

​ 实例化java.util.Timer对象,使用Timer.schedule或Timer.scheduleAtFixedRate等方法执行定时任务。

示例如下:
public class TimerExample {
    public static void main(String[] args) {
        timer1();
    }

    /**
     * 获取当前系统时间
     * @return
     */
    public static String getTime(){
        //获取当前的系统时间
        LocalDateTime now = LocalDateTime.now();
        //定义时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        //格式化时间
        return now.format(formatter);
    }
    /**
     * 测试JDK自带的Timer实现定时任务
     */
    public static void timer1(){
        Timer timer = new Timer();
        TimerTask timerTask = new TimerTask(){
            @Override
            public void run() {
                System.out.println(getTime()+"测试Timer实现定时任务");
            }
        };
        //延迟1s后执行任务,之后每隔2s执行一次
//        timer.scheduleAtFixedRate(timerTask,1000,2000);
        System.out.println(getTime()+"Timer启动");
        timer.schedule(timerTask,1000,2000);
    }
}
优点
1.简单易用

​ Timer类提供了非常简单的API用于安排定时任务的执行,只需要实例化一个Timer对象和一个TimerTask的任务对象,然后调用schedule或scheduleAtFixedRate方法就可以安排任务执行了。

2.延迟与周期性执行

​ Timer支持指定延迟后执行任务(如上述代码示例中的1000毫秒延迟),也支持以固定频率重复执行任务(如上述代码示例中的每隔2000毫秒执行一次),因此它非常适合用于需要定期执行某些操作的场景,例如定时刷新缓存、定期发送监控数据等。

3.轻量级

​ 对于简单的定时任务需求,Timer是一个轻量级的选择,因为它不需要引入额外的依赖库或者框架,直接使用JDK自带的功能即可满足需求。

缺点
1.单线程执行

​ Timer内部使用单个后台线程来执行所有定时任务。如果一个任务执行时间过长或抛出未捕获异常,会影响后续任务的执行,甚至导致整个调度系统崩溃。

2.缺乏容错性

​ 一旦TimerTask中的代码抛出异常,该任务将被取消,不会再执行,这可能会导致其他依赖此任务的任务无法正常运行。

3.精度有限

​ 由于Timer是单线程的原因,当多个任务同时触发时,它们会排队等待执行,因此任务的实际执行时间可能与预期有所偏差。

4.无法动态调整任务

​ 在Timer启动后,很难对已安排的任务进行修改或调整,如改变执行频率等。

​ 需要特别提醒的是,上面提到的单线程执行对应的是一个Timer实例,如果创建了多个Timer对象,每一个Timer都有自己独立的工作线程。

;