Java通过Timer与TimerTask实现定时任务调度方式

 更新时间:2024年12月23日 12:43:59   作者:灰太狼RD  
本文介绍了如何在Java中使用`Timer`和`TimerTask`类来实现定时任务调度,`Timer`类用于创建计时器并安排任务,而`TimerTask`类用于定义具体的任务,文章详细介绍了这两个类的方法和使用示例,包括创建任务、安排任务、取消任务等操作,通过一个简单的例子

前言

在实际的工作当中,经常要用到定时去操作一下任务,例如:数据的定时备份,用户的定时短信发送,定时刷新缓存等等。下面介绍实现的两个基础工具类Timer与TimerTask。

提示:以下是本篇文章正文内容,下面案例可供参考

一、什么Timer类

1、Timer类是一种线程设施,可以用来实现在某一个时间或某一段时间后安排某一个任务执行一次或定期重复执行。 

2、该功能要与TimerTask类配合使用,TimerTask类是用来实现由Timer创建的一次或者重复执行的某一个任务。 

3、每一个Timer对象对应一个线程,因此定时计数器所执行的任务应该迅速完成,否则可能会延迟后续任务的执行,而这写后续的任务就有可能堆在一起,等到任务执行完成之后才能快速连续执行。

Timer类常用的方法

方法描述
public Timer()创建一个计时器并启动该计时器
public void cancel()用来终止该计时器,并放弃所有己安排的任务,对当前正在执行的任务没有影响
public int purge()将所有己经取消的任务删除,一般用来释放内存空间
public void schedule(TimerTask task, Date time)安排一个任务在指定的时间执行,如果己经超过该时间,则立即执行
public void schedule(TimerTask task, Date firstTime, long period)安排一个任务在指定的时间执行,然后以固定的频率(单位:ms)重复执行
public void schedule(TimerTask task, long delay)安排一个任务在一段时间(单位:ms)后执行
public void schedule(TimerTask task, long delay, long period)安排一个任务在一段时间(单位:ms)后执行,然后以固定的频率 (单位:ms)重复执行
public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)安排一个任务在指定的时间执行,然后以近似固定的频率 (单位:ms) 重复执行
public void scheduleAtFixedRate(TimerTask task, long delay, long period)安排一个任务在一段时间(单位:ms)后普通执行,然后以近似固定的频率 (单位:毫秒)重复执行

备注:在这里需要说明的是:schedule()与scheduleAtrixedRare()方法的区别在于重复执行任务时对于时间间隔出现延迟的情况处理:

(1)、schedule()方法的执行时间间隔水远是固定的,如果之前出现了延迟的情况,之后也会继续按照设定好的时间间隔来执行。

(2)、scheduleAtrixedRare()方法可以根据出现的延时时间自动调整下一次间隔的执行时间。

二、什么TimerTask类

要想执行具体的定时任务,就要必须使用TimerTask类,TimerTask类是一个抽象类,使用的时候需要继承该类,并实现抽象房方法。

TimerTask类常用的方法,以及实现接口的顺序图

方法描述
public boolean cancel()用来终止该计时器,并放弃所有己安排的任务,对当前正在执行的任务没有影响
public abstract void run()该任务所要执行的具体操作,该方法为引入的接口 Runnable 中的方法,子类需要覆写此方法
public long scheduledExecutionTime()返回最近一次要执行该任务的时间(如果正在执行,则返回此任务的执行安排时间),一般在run()方法中调用,用来判断当前是否有足够的时问来执行完成该任务

三、代码实现定时调度

1.创建DuTask类

继承TimerTask类,实现调度的能力,用于执行业务逻辑

/**
 * @author   zhx
 * @date 2021-12-19
 */
public class DuTask extends TimerTask {
    @Override
    public void run() {
        SimpleDateFormat sDate=null;
        sDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        System.out.println("当前时间执行任务的时间为:"+sDate.format(new Date()));
    }
}

2.创建测试TestDuTask类

进行任务调度

/**
 * @author   zhx
 * @date 2021-12-19
 */
public class TestDuTask {
    public static void main(String[] args) {
        Timer timer = new Timer();//创建Timer类对象
        DuTask task = new DuTask();//定时任务
        //设置定时任务执行:  1秒后开始,每3秒重复执行
        timer.schedule(task,1000,3000);
    }
}

验证效果截图

间隔3秒执行的

总结

当然这执行我们在实际开过程中实现任务调度的方法之一,后续我将讲解第二种方式JobDetail实现定时任务调度。

相关文章

  • 基于Log4j2阻塞业务线程引发的思考

    基于Log4j2阻塞业务线程引发的思考

    这篇文章主要介绍了基于Log4j2阻塞业务线程引发的思考,基于很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringMVC通过注解实现全局异常处理问题小结

    SpringMVC通过注解实现全局异常处理问题小结

    文章介绍SpringMVC全局异常处理机制,通过@ControllerAdvice和@ExceptionHandler注解实现统一异常处理,提升代码可维护性与响应一致性,减少重复try-catch代码,增强系统健壮性,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • java删除指定目录下指定格式文件的方法

    java删除指定目录下指定格式文件的方法

    这篇文章主要为大家详细介绍了java删除指定目录下指定格式文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • java web实现邮箱激活与忘记密码

    java web实现邮箱激活与忘记密码

    这篇文章主要为大家详细介绍了java web实现邮箱激活与忘记密码、重置密码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Java报错org.hibernate.TypeMismatchException的解决方法

    Java报错org.hibernate.TypeMismatchException的解决方法

    在Java开发领域,尤其是涉及到数据持久化的项目中,Hibernate是一款广泛使用的强大工具,然而,可能会在使用过程中遭遇各种报错,其中org.hibernate.TypeMismatchException就是一个让人头疼的问题,下面我们一起深入剖析这个报错信息
    2024-11-11
  • Java Volatile应用单例模式实现过程解析

    Java Volatile应用单例模式实现过程解析

    这篇文章主要介绍了Java Volatile应用单例模式实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Java并发编程中的Callable、Future和FutureTask详解

    Java并发编程中的Callable、Future和FutureTask详解

    这篇文章主要介绍了Java并发编程中的Callable、Future和FutureTask详解,创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口,这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果,需要的朋友可以参考下
    2023-07-07
  • 使用@EnableWebMvc轻松配置Spring MVC

    使用@EnableWebMvc轻松配置Spring MVC

    这篇文章主要为大家介绍了使用@EnableWebMvc轻松配置Spring MVC实现示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 使用Java8中Optional机制的正确姿势

    使用Java8中Optional机制的正确姿势

    我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional,下面这篇文章主要给大家介绍了关于如何正确使用Java8中Optional机制的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-11-11
  • java中long和Long有什么区别详解

    java中long和Long有什么区别详解

    这篇文章主要介绍了Java中long和Long是基本数据类型和包装数据类型的区别,包括默认值、内存占用、使用场景、方法支持以及装箱和拆箱,包装数据类型如Integer提供了许多有用的方法,需要的朋友可以参考下
    2025-02-02

最新评论