一、概述
1、jdk的线程池和任务调用器分别由ExecutorService、ScheduledExecutorService定义,继承关系如下:
/
ThreadPoolExecutor:ExecutorService的实现类,其构造函数提供了灵活的参数配置,可构造多种类型的线程池,详细可参考JAVA进阶----ThreadPoolExecutor机制
ScheduledThreadPoolExecutor:ScheduledExecutorService的实现类,用于任务调动
2、spring task对定时任务的两个抽象:
- TaskExecutor:与jdk中Executor相同,引入的目的是为定时任务的执行提供线程池的支持
- TaskScheduler:对定时任务的抽象
继承关系如下:
TaskScheduler需要传入一个Runnable的任务做为参数,并指定需要周期执行的时间或者触发器(Trigger
)。
spring定义了Trigger接口的实现类CronTrigger,支持使用cron表达式指定定时策略,使用如下:
scheduler.schedule(task, new CronTrigger("30 * * * * ?"));
3、cron表达式
spring支持6个参数的cron表达式,格式如下:
{秒} {分} {时} {日期} {月} {星期}
- 秒:必填项,允许的值范围是0-59,支持的特殊符号包括'-*/,',','表示特定的某一秒才会触发任务,'-'表示一段时间内会触发任务,'*'表示每一秒都会触发,'/'表示从哪一个时刻开始,每隔多长时间触发一次任务。
- 分:必填项,允许的值范围是0-59,支持的特殊符号和秒一样,含义类推
- 时:必填项,允许的值范围是0-23,支持的特殊符号和秒一样,含义类推
- 日期:必填项,允许的值范围是1-31,支持的特殊符号相比秒多了
?
,表示与{星期}互斥,即意味着若明确指定{星期}触发,则表示{日期}无意义,以免引起冲突和混乱 - 月:必填项,允许的值范围是1-12(JAN-DEC),支持的特殊符号与秒一样,含义类推
- 星期:必填项,允许值范围是1~7 (SUN-SAT),1代表星期天(一星期的第一天),以此类推,7代表星期六,支持的符号相比秒多了
?
,表达的含义是与{日期}互斥,即意味着若明确指定{日期}触发,则表示{星期}无意义。
示例:
0 0 12 * * ? 每天中午12点触发 0 * 14 * * ? 每天下午2点到下午2:59期间的每1分钟触发 0 0/5 14 * * ? 每天下午2点到下午2:55期间的每5分钟触发 0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
关于cron表达式的详细介绍可参考spring定时任务详解
二、