核心

简单两步

@EnableScheduling  // 在springboot入口程序中添加,开启定时任务服务
@Scheduled(cron = "0/8 * * * * ? ")  // 定时任务上添加,设置定时任务计划

这样springboot就会接管定时任务自动按计划执行,不需要手动写调用方式

注意点

  • 定时job默认是单线程的,所以多个定时scheduler的时候,互相会产生干扰导致执行时机不可控
  • 可以使用@Async来开启异步, 就可以多线程执行定时scheduler了, 每个任务启动的执行线程都不一样
  • 如下是测试源代码以及验证线程问题

源代码

package com.starry.service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

@Service
public class MyTaskScheduleService {

    @Scheduled(cron = "0/5 * * * * ? ")
    public void PrintfHelloJob() {
        System.out.println("同步Hello,当前时间" + LocalDate.now() + "线程名" + Thread.currentThread().getName() + ",hello!!");
    }

    @Scheduled(cron = "0/8 * * * * ? ")
    public void PrintfTestJob() {
        System.out.println("同步test,当前时间" + LocalDate.now() + "线程名" + Thread.currentThread().getName() + ",Test!!");
    }

    /**
     * 多线程执行定时任务,否则下一次执行会被上次执行情况干扰
     */
    @Async
    @Scheduled(cron = "0/10 * * * * ? ")
    public void AsyncPrintfHelloJob() {
        System.out.println("异步JOB,当前时间" + LocalDate.now() + "线程名" + Thread.currentThread().getName() + ",hello!!");
    }
}