其中TimerTask实现了Runnable接口的抽象类,开发人员只需要继承TimerTask并实现run方法,将任务内容写入run方法中,然后就可以将其交给Timer去调度执行了。其中TimerTask实现了Runnable接口的抽象类,开发人员只需要继承TimerTask并实现run方法,将任务内容写入run方法中,然后就可以将其交给Timer去调度执行了。
TimerThread线程在start方法启动后,就会开始不断轮询,每次轮询都会获取TaskQueue中第一个TimerTask( 执行时间最小的TimerTask),判断当前是否已到执行时间:
执行后,判定该task是否需要重复执行,如需要,则重置该task的执行时间,重新放入TaskQueue中(放入后会自动排序)。
优点:JDK本身就自带该工具类,无需第三方依赖,只需实现TimerTask类即可使用Timer进行调度配置,使用起来简单方便。
缺点:Timer中所有的任务都一个TaskThread线程来调度和执行,任务的执行方式是串行的,如果前一个任务发生延迟或异常会影响到后续任务的执行。
注:scheduleAtFixedRate方法是基于初始延迟(initialDelay)后固定间隔(period)进行任务调度;scheduleWithFixedDelay方法是基于上次任务完成后固定的延迟时间来进行任务调度。两者的任务执行的维度不同。
而后DelayedWorkQueue中的任务会被调度线程从线程池中分配一个固定的线程进行调用,调用时执行run的方判断是否是周期性任务来决定是否要设置下次执行时间,以便下次执行。
ScheduledExecutorService虽然解决了Timer由于单线程导致的问题,但从上述schedule方法可以看出它是基于延迟(initialDelay)来设定具体执行时间的,虽然可以通过计算实现某些复杂的作业调度配置,但这种用法过于繁杂而且执行时间不够明确。
某些特殊的执行条件,如固定每个月几号执行,或是每天多个非固定间隔的时间点去执行同一任务等需求就无法实现,对于节假日等也无法控制,对此我们可以使用Quartz来实现这些相对复杂的调度需求。
Spring Quartz是在Spring框架中使用Quartz工具来实现任务调度的方式,在Spring下对Quartz可以方便的完成任务调度需要的配置。
Quartz是一个相对上述两种调度工具更为复杂的任务调度系统,使用Trigger, Job 和JobDetail对象来实现对各种类型任务的调度。Spring也需要配置好这些对象,才能使用Quartz的任务调度功能。
其中ExampleJob是实现了Job接口的QuartzJobBean继承类,它是真正的任务执行者。具体实现如下所示:
Quartz的触发器是之前两种调度工具最大的区别,Quartz实现了两个常用的触发器SimpleTrigger和CronTrigger,SimpleTrigger可配置简单的执行计划。CronTrigger则可以根据具体的Corn表达式配置各种复杂的执行计划,满足各种特殊的需求。
本文作者:邱志辉(点融),目前就职于点融网工程部FinCore team,喜欢电影、旅行,以及一切新事物。
推荐:
网友评论 ()条 查看