可以发现,当前任务一完成就会立刻执行下一次任务,这就是当任务的处理逻辑超过了固定的频率时间会出现的情况 。
fixedDelay@Slf4j@Component@EnableSchedulingpublic class TaskDemo {/*** 执行完成后间隔2秒执行下一次**/@Scheduled(fixedDelay = 2000)public void printTime2() throws InterruptedException {log.info("任务开始------- {}", LocalDateTime.now());Thread.sleep(4000);log.info("任务完成------- {}", LocalDateTime.now());}}
控制台输出:
2022-10-25 14:55:50.973INFO 22128 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务开始------- 2022-10-25T14:55:50.9732022-10-25 14:55:54.977INFO 22128 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务完成------- 2022-10-25T14:55:54.9772022-10-25 14:55:56.987INFO 22128 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务开始------- 2022-10-25T14:55:56.9872022-10-25 14:56:01.001INFO 22128 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务完成------- 2022-10-25T14:56:01.0012022-10-25 14:56:03.012INFO 22128 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务开始------- 2022-10-25T14:56:03.012
多个定时任务的执行同步如果我们写多个定时任务,那么它们只会同步执行,如下:
@Slf4j@Component@EnableSchedulingpublic class TaskDemo {@Scheduled(fixedRate = 2000)public void printTime3() throws InterruptedException {log.info("任务A开始------- {}", LocalDateTime.now());Thread.sleep(2000);log.info("任务A完成------- {}", LocalDateTime.now());}@Scheduled(fixedDelay = 2000)public void printTime4() throws InterruptedException {log.info("任务B开始------- {}", LocalDateTime.now());Thread.sleep(2000);log.info("任务B完成------- {}", LocalDateTime.now());}}
控制台输出:
2022-10-25 14:59:14.279INFO 21588 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务A开始------- 2022-10-25T14:59:14.2792022-10-25 14:59:16.283INFO 21588 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务A完成------- 2022-10-25T14:59:16.2832022-10-25 14:59:16.283INFO 21588 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务B开始------- 2022-10-25T14:59:16.2832022-10-25 14:59:18.288INFO 21588 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务B完成------- 2022-10-25T14:59:18.2882022-10-25 14:59:18.288INFO 21588 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务A开始------- 2022-10-25T14:59:18.2882022-10-25 14:59:20.301INFO 21588 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务A完成------- 2022-10-25T14:59:20.3012022-10-25 14:59:20.301INFO 21588 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务A开始------- 2022-10-25T14:59:20.3012022-10-25 14:59:22.307INFO 21588 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务A完成------- 2022-10-25T14:59:22.3072022-10-25 14:59:22.307INFO 21588 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务A开始------- 2022-10-25T14:59:22.3072022-10-25 14:59:24.323INFO 21588 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务A完成------- 2022-10-25T14:59:24.3232022-10-25 14:59:24.323INFO 21588 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务B开始------- 2022-10-25T14:59:24.3232022-10-25 14:59:26.337INFO 21588 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务B完成------- 2022-10-25T14:59:26.337
可以看到,只有某一个任务完成后,下一个任务才会执行 。
如果想要异步,如何异步呢?
异步很简单,使用 @EnableAsync
和 @Async
这两个注解就可以了,如下:
@Slf4j@Component@EnableScheduling@EnableAsyncpublic class TaskDemo {@Async@Scheduled(fixedRate = 2000)public void printTime3() throws InterruptedException {log.info("任务A开始------- {}", LocalDateTime.now());Thread.sleep(2000);log.info("任务A完成------- {}", LocalDateTime.now());}@Async@Scheduled(fixedDelay = 2000)public void printTime4() throws InterruptedException {log.info("任务B开始------- {}", LocalDateTime.now());Thread.sleep(2000);log.info("任务B完成------- {}", LocalDateTime.now());}}
经验总结扩展阅读
- 2023年9月28日挖坟墓行吗 2023年9月28日挖坟墓黄道吉日
- 2023年9月28日适合修造坟墓吗 2023年9月28日是修造坟墓的黄道吉日吗
- 2023年9月28日是制作棺材吉日吗 2023年9月28日是制作棺材的黄道吉日吗
- 菜粉蝶竟是我自己是什么梗什么意思 为什么白纸可以吸引菜粉蝶
- 变脸是我国哪个著名剧种的绝活 变脸一共能变几张脸
- realme真我v15什么时候发布_realme锦鲤手机发布时间
- 真我GTNeo2T测评_真我GTNeo2T续航情况测试
- 闻道Go语言,6月龄必知必会
- Work & Play 这是我们这一代是什么歌
- 吃避孕药失败的人多吗