您的位置:首页 > 编程语言 > Java开发

JAVA定时调度工具Timer篇

2017-12-29 22:14 253 查看

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缺陷;

    管理并发缺陷;

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

   抛出异常时的缺陷;

   如果在执行期间抛出RuntimeException,Timer会停止所有任务的执行;    结论:所以说Timer定时工具不适合高并发的任务处理,以及特定的时间,复杂时间个性化任务的处理;因此要处理一些特殊情况高并发的作业调度就需要引入Quartz开源任务调度框架。Quartz相对于Timer来说,能够解决点,项目中所带来的种种问题。接下来就让我们准备开启Quartz框架的学习吧!!!
     
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息