Java定时任务之Timer类API详解

 

 

Timer类结构

Timer类里有TimerThread和TaskQueue两个属性。

TaskQueue是一个Task任务队列,用于存放Task任务。

TimerThread继承Thread,用于执行存放在Queue里的Task任务。

Timer定时函数的用法

schedule(TimerTask task, long delay)

   task : 要执行的任务

   delay : 延迟的时间

   作用 : 程序运行之后,延迟delay毫秒后定时任务开始执行,且只执行一次

schedule(TimerTask task, Date time)

   task : 要执行的任务

   time : 执行的时间

   作用 : 当时间到达或者超过time时开始执行任务,且只执行一次

schedule(TimerTask task, long delay, long period)

   task : 要执行的任务

   delay : 延迟的时间

   period : 每次任务执行的间隔

   作用 : 延迟delay毫秒后开始执行任务,之后每间隔period毫秒执行一次任务

schedule(TimerTask task, Date firstTime, long period)

   task : 要执行的任务

   firstTime : 第一次开始执行的时间

   period : 每次任务执行的间隔

   作用 : 从firstTime开始执行任务,之后每period间隔执行一次任务

scheduleAtFixedRate(TimerTask task, long delay, long period)

   task : 要执行的任务

   delay : 延迟的时间

   period : 每次任务的间隔

   作用 : 延迟delay毫秒后开始执行任务,之后每间隔period毫秒执行一次任务

scheduleAtFixedRate(TimerTask task, Date firstTime,long period)

   task : 要执行的任务

   firstTime : 第一次任务执行的时间

   period : 每次任务执行的间隔

   作用 : 从firstTime开始执行任务,之后每period间隔执行一次任务

   scheduleAtFixedRate和schedule函数区别

  1. 当任务开始执行时间小于当前时间时,schedule函数从当前时间开始计时执行,scheduleAtFixedRate函数从设定的时间开始执行,并且为了赶上进度,会瞬间多次执行任务,因此TimerTask任务体需要考虑同步。
  2. 当任务执行需要的时间超过设定每次任务的执行时间间隔时,schedule函数下一次执行时间相对于上一次实际执行完成的时间,因此执行时间会不断后延,而scheduleAtFixedRate函数下一次执行时间相对于上一次开始的时间点,不会后延,因此存在并发性。

  其他函数

     cancel()函数 : 终止计时器,丢弃所有安排的任务,即清空当前Timer的TaksQueue队列。

      purge()函数  : 从Timer中移除所有已取消的任务,即部分TimerTask调用了Task的cancel()方法,取消了那个Task任务的执行,但        是那个Task任务还在Timer的Task队列了,purge函数的作用即将那些任务从队列中清除。

 TimerTask类

run函数 : 要执行的任务逻辑

cancel函数 : 取消当前任务

scheduledExecutionTime函数 : 返回当前任务最近的实际执行时间

Timer存在的缺陷

  1. 管理并发任务的缺陷
  2. 当任务抛出异常时的缺陷

   Timer和Quartz相比,Timer的任务调度只有一个后台线程在执行,而Quartz的任务调度是一个线程池在负责,并且Timer存在并发问题,虽然一个Timer调度器里可以放多个TimerTask任务,但每个任务都是串行执行的,并非并发执行。其次,当TimerTask执行任务时抛出异常会导致程序停止运行,TimerTask并不能捕捉处理异常,而且Timer也没有持久化能力,程序崩溃无法重新恢复崩溃前场景,因此简单定时任务可以使用Timer,复杂调度需要Quartz。

 

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的Timer可以用来定时执行任务。为了让任务在每天凌晨1点执行,可以使用Timerschedule方法来设置定时器。 首先,需要创建一个继承了TimerTask抽象的子,实现run方法来定义要执行的任务。在run方法中编写具体的任务代码。 然后,在主程序中创建Timer对象,并使用Timer对象的schedule方法来设置定时器。schedule方法需要传入一个TimerTask子的实例对象和一个Date对象, Date对象是要执行任务的时间。在本例中,需要将Date对象设置为每天凌晨1点。 最后,启动程序,Timer会在每天凌晨1点执行任务。需要注意的是,Java中的时间是按照GMT时间进行计算的。如果需要按照本地时间执行任务,可以使用Java中的Calendar将时间转换为本地时间。 示例代码如下: ```java import java.util.Timer; import java.util.TimerTask; import java.util.Calendar; public class TimerTaskExample { public static void main(String[] args) { TimerTask task = new MyTask(); Timer timer = new Timer(); Calendar calendar = Calendar.getInstance(); // 获取当前时间 calendar.set(Calendar.HOUR_OF_DAY, 1); //设置每天凌晨1点执行任务 calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); Date time = calendar.getTime(); timer.schedule(task, time); } } class MyTask extends TimerTask { public void run() { // 定时任务代码 System.out.println("任务开始执行..."); // ... } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值