我终于会写 Java 的定时任务了!( 五 )

可以发现,当前任务一完成就会立刻执行下一次任务,这就是当任务的处理逻辑超过了固定的频率时间会出现的情况 。
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());}}

经验总结扩展阅读