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

相关推荐
pingglala7 分钟前
winscp连接linux失败解决方法
java·linux·服务器
Javatutouhouduan7 分钟前
深入学习JVM底层原理:源码剖析与实例详解!
java·jvm·java面试·后端开发·java程序员·java八股文·java性能优化
Flynt11 分钟前
我把 JDK21 虚拟线程用成了"性能灾难",复盘完发现踩了三个大坑
java·ai编程
做一个快乐的小傻瓜17 分钟前
ZYNQ DEV套件引脚约束
java·linux·运维
CoderYanger17 分钟前
Java EE:6.网络编程套接字(第二弹)
java·网络·程序人生·面试·职场和发展·java-ee·学习方法
devilnumber18 分钟前
Java Lambda 表达式 200 条常见问题、坑点、易错点、规范清单
java·开发语言
极客先躯20 分钟前
高级java每日一道面试题-2026年02月12日-实战篇[Docker]-什么是容器的 Seccomp 配置?如何自定义?
java·运维·分布式·docker·容器·自动化·文件
大大杰哥21 分钟前
Vue2学习(3)--组件中的通信方式/组件之间的交互
java·前端·javascript
zzz_236821 分钟前
【Java基础】二叉树遍历与红黑树的完美平衡艺术——从递归崩溃到自平衡的硬核拆解
java·开发语言
斯内普吖24 分钟前
(开源)高校素拓分管理系统小程序实战指南 基于 Java + SpringBoot + uni-app + Vue + MySQL
java·spring boot·mysql·小程序·uni-app·开源