Java定时任务cron表达式
Java开发中经常会使用到定时任务,而cron表达式则是使用比较广泛的一种方式。cron表达式是一个字符串,用于定义计划任务的执行时间。在这篇文章中,我们将深入解析Java中的cron表达式,并且提供一些实例代码来帮助你更好的理解。
cron表达式基础
cron表达式由6个部分组成,每个部分使用空格进行分隔。这6个部分依次为:
序号 | 字段 | 允许的值 | 允许的特殊字符 |
---|---|---|---|
1 | 秒 | 0-59 | , – * / |
2 | 分 | 0-59 | , – * / |
3 | 小时 | 0-23 | , – * / |
4 | 日 | 1-31 | , – * ? / L W C |
5 | 月 | 1-12或JAN-DEC | , – * / |
6 | 周 | 1-7或SUN-SAT | , – * ? / L C # |
其中,第4个字段和第6个字段之间只能有一个是?或者L。
下面我们来深入解析每个字段:
1. 秒(Seconds)
用于规定分钟的哪几秒执行任务,允许通配符。
- *:所有秒数。
- ,:用于枚举多个时间(例如,1,3,5)。
- -:用于指定一个范围(例如,1-10)。
- /:用于规定时间间隔(例如,在5秒到30秒之间每隔3秒执行一次任务)。
例如,0/5就表示从0秒开始,每5秒执行一次任务。
2. 分钟(Minutes)
用于规定哪几分执行任务,允许通配符。
- *:所有分钟。
- ,:用于枚举多个时间(例如,1,3,5)。
- -:用于指定一个范围(例如,1-10)。
- /:用于规定时间间隔(例如,在5分钟到30分钟之间每隔3分钟执行一次任务)。
例如,0/5就表示从0分开始,每5分钟执行一次任务。
3. 小时(Hours)
用于规定哪几小时执行任务,允许通配符。
- *:所有小时。
- ,:用于枚举多个时间(例如,1,3,5)。
- -:用于指定一个范围(例如,1-10)。
- /:用于规定时间间隔(例如,在5小时到30小时之间每隔3小时执行一次任务)。
例如,0/5就表示从0小时开始,每5小时执行一次任务。
4. 日(Day)
用于规定哪几号执行任务,允许一些特殊字符。
- *:所有日子。
- ?:不指定具体的日子,用于日和周冲突的情况下。
- ,:用于枚举多个时间(例如,1,3,5)。
- -:用于指定一个范围(例如,1-10)。
- /:用于规定时间间隔(例如,在5天到30天之间每隔3天执行一次任务)。
- L:用于指定月份的最后一天(例如,1L表示1月份最后一天)。
- W:用于指定有效工作日(距离给定日期最近的工作日,例如15W)。
- #:用于指定该月的第几个星期几(例如2#1表示第二个星期一)。
需要注意一下,当日和周两个字段都指定了某个值,如果日和周的指定值不一致,那么任务就不会被执行。例如,当指定日为5号,周为星期六时,任务在5号星期六才会被执行。
5. 月(Month)
用于规定哪几个月执行任务,允许通配符。
- *:所有月份。
- ,:用于枚举多个时间(例如,1,3,5)。
- -:用于指定一个范围(例如,1-10)。
- /:用于规定时间间隔(例如,在5月到10月之间每隔3个月执行一次任务)。
- JAN-DEC:用于指定具体的月份,可以使用月份的小写字母缩写(例如,JAN表示1月)。
6. 周(Day of Week)
用于规定星期几执行任务,允许一些特殊字符。
- *:所有周几。
- ?:不指定具体的周几,用于日和周冲突的情况下。
- ,:用于枚举多个时间(例如,1,3,5)。
- -:用于指定一个范围(例如,1-6,表示周一到周六)。
- /:用于规定时间间隔(例如,在周一到周五之间每隔2天执行一次任务)。
- L:用于指定该月的最后一个工作日,例如15L表示该月的倒数第一个工作日)。
- #:用于指定该月的第几个星期几(例如2#1表示第二个星期一)。
需要注意一下,当日和周两个字段都指定了某个值,如果日和周的指定值不一致,那么任务就不会被执行。例如,当指定日为5号,周为星期六时,任务在5号星期六才会被执行。
示例代码
下面我们来看一些示例代码,让大家更好的理解cron表达式的使用。
示例一
使用cron表达式每隔5秒执行任务,代码如下:
import java.util.Timer;
import java.util.TimerTask;
import org.quartz.CronExpression;
public class Main {
public static void main(String[] args) throws Exception {
//创建定时器
Timer timer = new Timer();
//创建定时任务
TimerTask task = new TimerTask(){
public void run(){
System.out.println("task is running...");
}
};
//创建cron表达式
CronExpression expression = new CronExpression("0/5 * * * * ?");
//启动定时任务
timer.schedule(task, 0, 1000);
}
}
示例二
使用cron表达式在每周一的10点执行任务,代码如下:
import java.util.Timer;
import java.util.TimerTask;
import org.quartz.CronExpression;
public class Main {
public static void main(String[] args) throws Exception {
//创建定时器
Timer timer = new Timer();
//创建定时任务
TimerTask task = new TimerTask(){
public void run(){
System.out.println("task is running...");
}
};
//创建cron表达式
CronExpression expression = new CronExpression("0 0 10 ? * MON");
//启动定时任务
timer.schedule(task, 0, 1000);
}
}
结论
cron表达式是一种非常常见的定时任务调度方式,在 Java 中使用非常广泛。掌握 cron 的基本格式和语法,以及各个字段的含义,可以帮助我们更好地使用定时任务。在具体的应用场景中,我们可以根据需要来编写不同的 cron 表达式,以便更好地满足实际的需求。