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

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

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

2.创建并启动定时器

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

示例如下:
java 复制代码
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都有自己独立的工作线程。

相关推荐
程序员西西2 小时前
深入剖析 Java 中的 ZGC 机制:原理、优势与实践
java·后端·算法
月明长歌2 小时前
【码道初阶】Leetcode.189 轮转数组:不熟悉ArrayList时踩得坑,被Arraylist初始化骗了?
java·算法·leetcode·职场和发展
BBB努力学习程序设计2 小时前
Java设计模式实战指南:创建型模式深度解析
java
BBB努力学习程序设计2 小时前
Java内存管理与JVM调优完全指南
java
编程火箭车2 小时前
【Java SE 基础学习打卡】22 分支结构 - if
java·流程控制·编程基础·if语句·分支结构·条件判断·新手避坑
Ivy_belief2 小时前
C++新特性汇总:涵盖C++11到C++23
java·c++·c++11·c++23
哈哈哈笑什么2 小时前
Spring Boot接口国际化异常信息方案
java·spring boot·后端
qq_162987692 小时前
SpringBoot框架选型
java·spring boot·后端
爱学习的小可爱卢2 小时前
JavaEE进阶-SpringBoot三层架构:餐厅模式解析
java·java-ee
掉鱼的猫2 小时前
Java 低代码平台的“动态引擎”:Liquor
java·低代码·groovy