spring boot 多线程并发执行定时任务
2019-03-01 15:26
531 查看
版权声明:原创欢迎转载,转载请注明出处 https://blog.csdn.net/ye17186/article/details/88059700
Spring Boot默认情况下,所有定时任务会在一个线程中去执行,下面看测试代码,定义了三个测试Job:
[code]@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
实际执行结果:
[code]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
会看到他们的线程名都为schedule-1,观察line1-4,job1执行过程中,job2,job3触发时间到了,也没有执行。而是等job1结束后,立马执行一次(即使34秒的时候并不是它们的触发时间)。
上干货,并发执行多个定时任务,只需要新增一个线程池配置即可:
[code]@Configuration public class ScheduleConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { int corePoolSize = 5; String nameFormat = "Schedule-Pool-%d"; // 设置线程名 ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() .setNameFormat(nameFormat).build(); // 初始化线程池 ThreadPoolExecutor threadPool = new ScheduledThreadPoolExecutor(corePoolSize, namedThreadFactory); scheduledTaskRegistrar.setScheduler(threadPool); } }
下面再来看执行结果:
[code]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动态配置定时任务2种方式,整合Quartz多线程并发执行多个定时任务配置
- springboot动态配置定时任务2种方式,整合Quartz多线程并发执行多个定时任务配置
- spring-boot | 多线程并发定时任务
- Spring Boot使用方法小札(2):执行定时任务
- spring boot-分布式定时任务中,异步执行时JMS无法重新投递消息
- Spring Boot 定时任务之多线程
- spring boot定时任务多线程配置
- SpringBoot开发详解(十二) -- SpringBoot中执行定时任务
- 详解SpringBoot 创建定时任务(配合数据库动态执行)
- springboot 执行定时任务
- springBoot 中定时任务在linux中执行了两次
- spring 第13天 使用@scheduled注解执行定时任务
- (14)Spring Boot定时任务的使用【从零开始学Spring Boot】
- spring-boot(五) RabbitMQ详解 定时任务
- Spring Boot @Async 异步任务执行方法
- spring 定时任务执行两次 解决方案
- spring整合Quartz定时器(二)---基于@Scheduled注解执行定时任务
- spring-task定时任务执行两次解决方案
- Linux环境 Spring整合Quartz定时任务执行2次,Spring定时任务执行2次
- 【转载】基于Spring Boot 实现定时任务