主启动类@SpringBootApplicationpublic class SpringBootTaskApplication {public static void main(String[] args) {SpringApplication.run(SpringBootTaskApplication.class, args);}}定义配置文件Spring Task 调度任务的配置,对应 TaskSchedulingProperties 配置类 。SpringBoot允许我们在yml或properties定制这些外部化配置,如果不配置也是没有关系的,自动配置已经给你一套默认的值了 。
spring:task:scheduling:thread-name-prefix: summerday- # 线程池的线程名的前缀 。默认为 scheduling-,建议根据自己应用来设置pool:size: 10 # 线程池大小 。默认为 1,根据自己应用来设置shutdown:await-termination: true # 应用关闭时,是否等待定时任务执行完成 。默认为 false,建议设置为 trueawait-termination-period: 60 # 等待任务完成的最大时长,单位为秒 。默认为 0,根据自己应用来设置启动项目测试# 初始化一个 ThreadPoolTaskScheduler 任务调度器2020-11-30 23:04:51.886INFO 10936 --- [restartedMain] o.s.s.c.ThreadPoolTaskScheduler: Initializing ExecutorService 'taskScheduler'# 每5s执行一次定时任务2020-11-30 23:04:55.002INFO 10936 --- [summerday-1] com.hyh.task.DemoTask: [定时任务第 1 次执行]2020-11-30 23:05:00.002INFO 10936 --- [summerday-1] com.hyh.task.DemoTask: [定时任务第 2 次执行]2020-11-30 23:05:05.002INFO 10936 --- [summerday-2] com.hyh.task.DemoTask: [定时任务第 3 次执行]2020-11-30 23:05:10.001INFO 10936 --- [summerday-1] com.hyh.task.DemoTask: [定时任务第 4 次执行]2020-11-30 23:05:15.002INFO 10936 --- [summerday-3] com.hyh.task.DemoTask: [定时任务第 5 次执行]SpringTask异步任务SpringTask除了@Scheduled、@EnableScheduling同步定时任务之外,还有@Async、@EnableAsync 开启异步的定时任务调度 。
SpringBoot自动配置类对异步的支持:org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration
@Async注解添加@Async@Scheduled(cron = "0/1 * * * * *")public void asyncTask() {sleep();System.out.println(Thread.currentThread().getName() + " async-task 执行,当前时间: " + LocalDateTime.now());}@EnableAsync注解添加@Configuration@EnableScheduling// 同步@EnableAsync // 异步public class ScheduleConfig {}配置文件spring:task:# Spring 执行器配置,对应 TaskExecutionProperties 配置类 。对于 Spring 异步任务,会使用该执行器 。execution:thread-name-prefix: async- # 线程池的线程名的前缀 。默认为 task-,建议根据自己应用来设置pool: # 线程池相关core-size: 8 # 核心线程数,线程池创建时候初始化的线程数 。默认为 8。max-size: 20 # 最大线程数,线程池最大的线程数,只有在缓冲队列满了之后,才会申请超过核心线程数的线程 。默认为 Integer.MAX_VALUEkeep-alive: 60s # 允许线程的空闲时间,当超过了核心线程之外的线程,在空闲时间到达之后会被销毁 。默认为 60 秒queue-capacity: 200 # 缓冲队列大小,用来缓冲执行任务的队列的大小 。默认为 Integer.MAX_VALUE。allow-core-thread-timeout: true # 是否允许核心线程超时,即开启线程池的动态增长和缩小 。默认为 true。shutdown:await-termination: true # 应用关闭时,是否等待定时任务执行完成 。默认为 false,建议设置为 trueawait-termination-period: 60 # 等待任务完成的最大时长,单位为秒 。默认为 0,根据自己应用来设置同步与异步对比@Componentpublic class DemoAsyncTask {@Scheduled(cron = "0/1 * * * * *")public void synTask() {sleep();System.out.println(Thread.currentThread().getName() + " syn-task 执行,当前时间: " + LocalDateTime.now());}@Async@Scheduled(cron = "0/1 * * * * *")public void asyncTask() {sleep();System.out.println(Thread.currentThread().getName() + " async-task 执行,当前时间: " + LocalDateTime.now());}private void sleep() {try {Thread.sleep(10 * 1000);} catch (InterruptedException e) {e.printStackTrace();}}}同时开启同步和异步任务,假设任务本身耗时较长,且间隔较短:间隔1s,执行10s,同步与异步执行的差异就此体现 。

文章插图
可以看到,同步任务并没有每间隔1s就执行,而是串行在一起,等前一个任务执行完才执行 。而异步任务则不一样,成功将串行化的任务并行化 。
原文链接:https://www.cnblogs.com/summerday152/p/14070941.html如果觉得本文对你有帮助,可以转发关注支持一下
【SpringBoot中的定时任务的同步与异步你确定真的知道?】
推荐阅读
- 中国联通|日赚3.87亿!三大运营商财报中的小秘密
- 白云山中的茶源胜境,灵与元居士青山潭饮茶饮茶诗歌作品
- 2016版word表格中文字上下居中方法-2013word表格中的文字怎么上下居中-
- 红楼梦中的端午节
- 六道中的阿修罗是什么?
- 历史中的甘罗 历史上的甘罗最后到底怎么样
- 基于SpringBoot的微服务架构与K8S容器部署实践
- 三国演义中的空城计 三国空城计真相
- 杨家将著名将领是谁 杨家将中的人物
- 家里无线网络每天不定时段出现网速很慢或者直接无连接,这是怎么回事?
