@Scheduled(cron = "0/5 * * * * ?")
public void setScheduleTaskOne(){
System.out.println("执行静态定时任务时间(One):"+ LocalDateTime.now());
* 方式二
* 设置定时任务
* @param
* @return
@Scheduled(fixedRate = 5000)
public void setScheduleTaskTwo(){
System.out.println("执行静态定时任务时间(Two):"+ LocalDateTime.now());
运行结果:
使用注解 @Scheduled 设置任务时间的 cron表达式:
(1)cron表达式常用的七个参数 * * * * * * *:
秒(0~59):0/5:每隔五秒
分(0~59):0/1:每隔一分钟
时(0~23):0/1:每隔一小时
日(1~31):
月(1~11):
星期(1~7):1表示星期天
年:可留空
(2)每个域(*)使用的符号
*:表示任意值,如在second域中使用*,表示每秒都会触发定时任务
?:只能在日或星期中使用,表示任意值
-:表示范围,如在second域中使用5-20,表示5秒到20秒每秒都会触发定时任务
/:表示起始时间开始触发,然后每隔固定时间触发一次,如在second域中5/20,表示在5秒触发一次定时任务后,间隔20秒后的第25秒触发定时任务,再间隔20秒后的第45秒触发定时任务
,:表示列出枚举值,如在second域中使用5,20,表示在第五秒和第20秒都会触发定时任务
L:表示最后,只能在日或星期中使用,例如在星期域中使用5L,表示最后一个星期4触发任务
W:表示有效工作日(星期一到星期五),只能在日域中使用,系统将在离指定日期的最近的有效工作日触发事件,不会跨月
LW:表示该月的最后一个工作日
#:用于确定每个月第几个星期几,只能出现在星期域,例如4#2,表示某月的第二个星期三
缺点:在修改定时任务执行周期时,需要重启应用才会生效
(3)@Scheduled(fixedRate = 5000) 控制定时
@Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
@Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
@Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按 fixedRate 的规则每5秒执行一次
2、基于接口SchedulingConfigurer(动态)
(1)导入依赖包
<!--添加Web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--添加MySql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--添加MybatisPlus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
(2)实体类
@TableName(value = "cron")
@Data
public class Cron {
private String cronId;
private String cron;
(3)mapper接口
@Mapper
public interface CronMapper extends BaseMapper<Cron> {
(4)定时任务类
@EnableScheduling
@Configuration
public class DynamicScheduleTask implements SchedulingConfigurer {
@Autowired
CronMapper cronMapper;
* 接口方式
* @param
* @return
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
//1、添加任务内容(Runnable)
() -> System.out.println("执行动态定时任务:"+ LocalDateTime.now().toLocalTime()),
//2、设置执行周期(Trigger)
triggerContext -> {
//从数据库获取执行周期
String cron = cronMapper.selectOne(new LambdaQueryWrapper<Cron>().eq(Cron::getCronId, "1")).getCron();
if (StringUtils.isEmpty(cron)){
return new CronTrigger(cron).nextExecutionTime(triggerContext);
(5)数据库
CREATE TABLE `cron` (
`cron_id` varchar(30) NOT NULL PRIMARY KEY,
`cron` varchar(30) NOT NULL
INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');
(6)运行结果
3、多线程定时任务
@EnableAsync
@EnableScheduling
@Configuration
public class MultithreadScheduleTask {
@Async
@Scheduled(fixedDelay = 1000) //间隔1秒
public void first() throws InterruptedException {
System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
System.out.println();
Thread.sleep(1000 * 10);
@Async
@Scheduled(fixedDelay = 2000)
public void second() {
System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
System.out.println();
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?