Java通过Timer与TimerTask实现定时任务调度方式
作者:灰太狼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实现定时任务调度。