JAVA定时调度工具Timer篇

Timer简介

    Timer是Java自己提供的定时任务工具,在java.Util.Timer包下。
    定义 有且仅有一条后台线程对多个任务进行定时定频率的调度。

主要构件

      Timer→TimerTask     正如名字所显示的,Timer是通过定时调度TiemrTask来完成定时操作的工作。Timer可以理解为后台的调度线程,而TimerTask就是作业所在的类。
如图Timer工具类详解;

Timer是主体类,下面有俩个重要的属性,一个是TimerThead,对应的就是后台的timer的执行线程,另外一个是TaskQueue队列,下面的子类TimerTask对应的就是作业线程;
其中TimerTask中的run()方法,就是业务逻辑实现的方法。整个流程,timerThread通过定期调用TaskQueue队列中的TimerTask下的run()方法实现对作业的定时调度。

代码的实现

    下面就通过代码的具体事例来实现上面所说的知识点;首先是TimerTask,
public class TimerDemo extends TimerTask {
    /**
     * 创建TimerDemo类,继承TimerTask
     */
    @Override
    public void run() {
      //获取最近一次任务的时间
        Date date = new Date()
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前任务调度时间:"+sf.format(date));
    }
}
   然后创建Timer对象来调用run()方法;
public class TimerTest {
    public static void main(String[] args) {
        //创建Timer对象
        Timer timer = new Timer();
        TimerDemo td = new TimerDemo();
        //获取当前时间
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar ca = Calendar.getInstance();
        System.out.println("Current time is:"+sf.format(ca.getTime()));
        //通过调用Timer对象schedule方法,实现任务的定时调度
        timer.schedule(td,ca.getTime(),2000);
    }

}
上面的Timer对象通过调用schedule()方法实现对TimerTask对象中任务的定时调度。其中schedule是实现定时调度的重要环节,下面将详细解答几种Schedule的使用场景。

schedule四种用法;

    1、schedule(task,time)
            参数:task,所以执行的任务;time,执行任务的时间;
            作用:在时间等于time时候,或者超过time时,执行task任务,且执行一次。
    2、schedule(task,time,peroid)
            参数:task,所以执行的任务;time, 首次执行任务的时间;peroid, 执行一次task的时间间隔,单位为毫秒;
           作用:在时间等于或者超过time首次执行task,之后每隔peroid毫秒执行一次;
    3、schedule(task,delay)
            参数:task,所以执行的任务;delay,执行任务前延迟时间,时间是毫秒;
            作用:等待dealy毫秒后(距离当前时间),执行且执行一次task;
    4、schedule(task,dealy,period)
            参数:task,所以执行的任务;delay,执行任务前延迟时间,时间是毫秒;period, 执行一次task的时间间隔,单位为毫秒;
           作用:等待delay毫秒后执行一次task,每隔period后执行一次;

Timer下另外两个重要函数用法;

    1、scheduleAtFixedRate(task,time,period)
           参数:task,所以执行的任务;time,首次执行任务的时间;peroid,执行一次task的时间间隔,单位为毫秒;
           作用:在时间等于或者超过time首次执行task,之后每隔peroid毫秒执行一次;
     2、scheduleAtFixedRate(task,delay,period)
           参数:task,所以执行的任务;delay,执行任务前延迟时间,时间是毫秒;period,执行一次task的时间间隔,单位为毫秒;
           作用:等待delay毫秒后执行一次task,每隔period后执行一次;
           schedule与scheduleAtFixedRate区别;
            可以看出和上面的schedule功能是相同的,两者的区别是;这里面考虑到一个问题为, 首次执行的时间比当前时间早,两种方法的
          处理方式上还有所不同,schedule;如果上一次执行的时间被延迟了,下一次执行的时间按照,上一次执行完的时间点,接着计算;
          而 scheduleAtFixedRate当执行的时间比当前的时间早,下一次执行的时间也会按照上一次执行完的时间点接着计算,并且为了赶上
          进度会多次执行任务,因此在 scheduleAtFixedRate情况下会考虑到同步的情况。
          第二种情况。任务执行时间超出设置的间隔时间,schedule函数,针对这种情况上次执行时间相对于上一次实际完成的时间点,时间
          会不断延后;而scheduleAtFixedRate方法下一次执行时间相对于上一次执行的时间点,时间一般不会延后,存在并发性。

其他重要函数;

 TimerTask下重要的函数; 
    TimerTask的cancel()函数的作用:取消当前TimerTask里的任务
    TimerTask的scheduleExecutionTime()作用:返回此任务最近实际执行的已安排执行的时间,返回值:最近发生此任务执行安排的时间,为long型
Timer下重要函数;
    Timer的cancel()函数的作用:终止此计时器,丢弃所有当前已安排的任务
    Timer的purge()函数的作用:从此计时器的任务队列中移除所有已取消的任务。返回值:从队列中移除的任务数。

Timer缺陷;

    管理并发缺陷;

    因为其后台是一个线程来调度任务,不存在多线程调度的情况,所以在多个任务调度的情况下会出现并发的缺陷,导致实际执行情况与预期不符;

   抛出异常时的缺陷;

   如果在执行期间抛出RuntimeException,Timer会停止所有任务的执行;
  
  结论:所以说Timer定时工具不适合高并发的任务处理,以及特定的时间,复杂时间个性化任务的处理;因此要处理一些特殊情况高并发的作业调度就需要引入Quartz开源任务调度框架。Quartz相对于Timer来说,能够解决点,项目中所带来的种种问题。接下来就让我们准备开启Quartz框架的学习吧!!!
 
 


     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值