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都有自己独立的工作线程。

相关推荐
孤廖19 小时前
【算法磨剑:用 C++ 思考的艺术・Dijkstra 实战】弱化版 vs 标准版模板,洛谷 P3371/P4779 双题精讲
java·开发语言·c++·程序人生·算法·贪心算法·启发式算法
码畜也有梦想19 小时前
Maven中optional的作用
java·jenkins·maven
云和数据.ChenGuang20 小时前
java常见SSL bug解决方案
java·bug·ssl
songx_9920 小时前
leetcode29( 有效的括号)
java·数据结构·算法·leetcode
于樱花森上飞舞20 小时前
【java】常见排序算法详解
java·算法·排序算法
维持好习惯20 小时前
复杂Excel文件导入功能(使用AI快速实现)
java·spring boot·excel
酷炫码神20 小时前
第 2 篇:Java 入门实战(JDK8 版)—— 编写第一个 Java 程序,理解基础运行逻辑
java·开发语言·策略模式
月阳羊20 小时前
【硬件-笔试面试题-93】硬件/电子工程师,笔试面试题(知识点:波特图)
java·经验分享·单片机·嵌入式硬件·面试
choice of21 小时前
SpringMVC通过注解实现全局异常处理
java·后端·spring
单线程bug21 小时前
Spring Boot中Filter与Interceptor的区别
java·spring boot·后端