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框架的学习吧!!!相关文章推荐
- Java定时任务调度工具详解之Timer篇
- java定时调度工具quartz
- JAVA定时调度工具Timer的缺陷
- Java定时任务调度工具详解(8)— Quartz 之 quartz.properties文件
- JAVA定时调度工具详细解析
- Java定时任务调度工具Timer
- Java定时任务调度工具详解之Timer篇
- Java定时任务调度工具详解(5)— Quartz 之 Trigger
- Java定时调度任务详解之Timer篇
- Java定时任务调度工具详解之Quartz篇(中级)二:SimpleTrigger& CronTrigger&浅谈Scheduler&QuartzProperties文件
- java定时任务调度工具之Timer
- java定时任务调度工具Timer和Quartz
- Java定时任务调度工具详解(3)— Quartz 简介
- Java 定时任务调度工具 Quartz(Part 2)
- Java定时任务调度工具详解(7)— Quartz 之 Scheduler
- Java定时任务调度工具详解之Quartz篇(中级)一:浅谈JobExecutionContext&JobDatai&浅谈Trigger
- Java 定时任务调度工具 Quartz(Part 1)
- Java定时任务调度工具详解(6)— Quartz 之 SimpleTrigger、CronTrigger、Cron表达式
- java定时任务调度工具-quartz
- Java定时任务调度工具详解(1)— Timer 简介