概述
定时任务的作用是在设定的时间和日期后自动执行任务,执行任务的周期既能是单次也能是周期性。
Timer
JDK自带的Timer是最古老的定时任务实现方式了。Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以安排任务“执行一次”或者定期“执行多次”。
在实际的开发当中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。
总结:
(1)Timer的方法整体可以分为按延时时间和日期时间两种执行任务,其参数分别对应long delay、Date time;
(2)其中schedule()方法是按照固定间隔来定时执行任务,而scheduleAtFixedRate()方法是按照固定速率来定时执行任务的,他们的区别是如果任务执行时间比较长,已经执行到下一个周期了,schedule()方法执行的任务错过了就错过了,而scheduleAtFixedRate()方法则会努力赶上,保障周期内的任务执行速率固定;
ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。
ScheduledThreadPoolExecutor的层级结果如下:
ScheduledThreadPoolExecutor中实现的方法和Timer差不多,都能够实现按照延时和日期来执行任务,也区分按照固定延时时间和固定速率来执行任务。但和Timer的最大区别是ScheduledThreadPoolExecutor的定时任务是是多线程执行的,每开始执行一个定时任务,他就会从线程池中取一个线程来执行,这样的话他就不存在一个定时任务延期影响后一个定时任务的情况了。他的原理是使用 DelayQueue 作为延时任务队列,等时间到了再创建工作线程执行。
JDK原生的定时任务实现方式Timer和ScheduledThreadPoolExecutor最大的问题是它不支持cron表达式和持久化机制,这个在下面的Spring Task和Quartz中得到了解决。
Spring Task
从Spring 3开始,Spring自带了一套定时任务工具Spring Task,可以把它看成是一个轻量级的Quartz,使用起来十分简单,除Spring相关的包外不需要额外的包,支持注解和配置文件两种形式。通常情况下在Spring体系内,针对简单的定时任务,可直接使用Spring提供的功能。
在项目实践中通常是在需要做定时任务的方法上添加@Scheduled注解,并在启动类上添加@EnableScheduling注解。
Spring Task底层是基于ThreadPoolTaskScheduler来实现,可以自定义线程池的大小等参数,只需要实现SchedulingConfigurer接口即可。
Spring task支持延时下发任务和cron定时执行任务,但Spring task 本身不支持持久化,也没有推出官方的分布式集群模式,只能靠开发者在业务应用中自己手动扩展实现,无法满足可视化,易配置的需求。
http://t.csdnimg.cn/gT7Yo