Spring Boot默认情况下,所有定时任务会在一个线程中去执行,下面看测试代码,定义了三个测试Job:
@Component
@Slf4j
public class TestJob {
@Scheduled(cron = "0/3 * * * * ? ")
public void job1() {
log.info("do job1 start");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("do job1 end");
}
@Scheduled(cron = "0/7 * * * * ? ")
public void job2() {
log.info("do job2");
}
@Scheduled(cron = "0/13 * * * * ? ")
public void job3() {
log.info("do job3");
}
}
理论上,如果互不干扰的话,三个任务的触发时间点为:
job1触发:0,3,6,9,12……
job2触发:0,7,14,21,28,35,42,49,56
job3触发:0,13,26,39,52
实际执行结果:
2019-03-01 14:59:24 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job1 start
2019-03-01 14:59:34 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job1 end
2019-03-01 14:59:34 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job3
2019-03-01 14:59:34 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job2
2019-03-01 14:59:35 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job2
2019-03-01 14:59:36 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job1 start
2019-03-01 14:59:46 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job1 end
2019-03-01 14:59:46 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job3
2019-03-01 14:59:46 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job2
2019-03-01 14:59:48 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job1 start
2019-03-01 14:59:58 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job1 end
2019-03-01 14:59:58 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job2
2019-03-01 14:59:58 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job3
2019-03-01 15:00:00 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:00:00 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job3
2019-03-01 15:00:00 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job1 start
2019-03-01 15:00:10 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job1 end
2019-03-01 15:00:10 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:00:12 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job1 start
2019-03-01 15:00:22 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job1 end
2019-03-01 15:00:22 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job3
2019-03-01 15:00:22 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:00:24 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job1 start
2019-03-01 15:00:34 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job1 end
2019-03-01 15:00:34 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job3
2019-03-01 15:00:34 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:00:35 INFO 7868 --- [ scheduling-1] c.yclouds.service.demo.TestJob : do job2
上干货,并发执行多个定时任务,只需要新增一个线程池配置即可:
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
// 设置线程池
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setThreadNamePrefix("Schedule-Task-");
taskScheduler.setPoolSize(5);
taskScheduler.initialize();
scheduledTaskRegistrar.setTaskScheduler(taskScheduler);
}
}
下面再来看执行结果:
2019-03-01 15:21:00 INFO 11204 --- [Schedule-Pool-2] c.yclouds.service.demo.TestJob : do job1 start
2019-03-01 15:21:00 INFO 11204 --- [Schedule-Pool-4] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:21:00 INFO 11204 --- [Schedule-Pool-3] c.yclouds.service.demo.TestJob : do job3
2019-03-01 15:21:07 INFO 11204 --- [Schedule-Pool-4] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:21:10 INFO 11204 --- [Schedule-Pool-2] c.yclouds.service.demo.TestJob : do job1 end
2019-03-01 15:21:12 INFO 11204 --- [Schedule-Pool-2] c.yclouds.service.demo.TestJob : do job1 start
2019-03-01 15:21:13 INFO 11204 --- [Schedule-Pool-0] c.yclouds.service.demo.TestJob : do job3
2019-03-01 15:21:14 INFO 11204 --- [Schedule-Pool-3] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:21:21 INFO 11204 --- [Schedule-Pool-3] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:21:22 INFO 11204 --- [Schedule-Pool-2] c.yclouds.service.demo.TestJob : do job1 end
2019-03-01 15:21:24 INFO 11204 --- [Schedule-Pool-2] c.yclouds.service.demo.TestJob : do job1 start
2019-03-01 15:21:26 INFO 11204 --- [Schedule-Pool-0] c.yclouds.service.demo.TestJob : do job3
2019-03-01 15:21:28 INFO 11204 --- [Schedule-Pool-1] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:21:34 INFO 11204 --- [Schedule-Pool-2] c.yclouds.service.demo.TestJob : do job1 end
2019-03-01 15:21:35 INFO 11204 --- [Schedule-Pool-1] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:21:36 INFO 11204 --- [Schedule-Pool-0] c.yclouds.service.demo.TestJob : do job1 start
2019-03-01 15:21:39 INFO 11204 --- [Schedule-Pool-3] c.yclouds.service.demo.TestJob : do job3
2019-03-01 15:21:42 INFO 11204 --- [Schedule-Pool-4] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:21:46 INFO 11204 --- [Schedule-Pool-0] c.yclouds.service.demo.TestJob : do job1 end
2019-03-01 15:21:48 INFO 11204 --- [Schedule-Pool-0] c.yclouds.service.demo.TestJob : do job1 start
2019-03-01 15:21:49 INFO 11204 --- [Schedule-Pool-4] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:21:52 INFO 11204 --- [Schedule-Pool-2] c.yclouds.service.demo.TestJob : do job3
2019-03-01 15:21:56 INFO 11204 --- [Schedule-Pool-1] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:21:58 INFO 11204 --- [Schedule-Pool-0] c.yclouds.service.demo.TestJob : do job1 end
2019-03-01 15:22:00 INFO 11204 --- [Schedule-Pool-0] c.yclouds.service.demo.TestJob : do job1 start
2019-03-01 15:22:00 INFO 11204 --- [Schedule-Pool-1] c.yclouds.service.demo.TestJob : do job3
2019-03-01 15:22:00 INFO 11204 --- [Schedule-Pool-3] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:22:07 INFO 11204 --- [Schedule-Pool-3] c.yclouds.service.demo.TestJob : do job2
2019-03-01 15:22:10 INFO 11204 --- [Schedule-Pool-0] c.yclouds.service.demo.TestJob : do job1 end
三个任务都在各自的线程里执行,到点就触发,互不干扰。
springboot其他学习demo汇总:
地址:https://github.com/ye17186/spring-boot-learn
内容:
- SpringBoot中使用
@Async
注解实现异步调用Demo - JAVA中常用的设计模式示例Demo
- SpringBoot中发送邮件的Demo
- SpringBoot统一异常处理的Demo
- SpringBoot 文件上传与下载的Demo
- SpringBoot 集成Log4j2的Demo
- SpringBoot集成Mybatis的Demo
- SpringBoot集成Mybatis-Plus的Demo
- SpringBoot集成定时任务的Demo