在开触发器时,会自动开启一个线程处理任务。不用担心和主程序的阻塞问题,但需注意任务之间的阻塞问题,如果是异步则会为每个任务都开启,无需担心任务之间的阻塞问题。
- 在spring-boot启动类上添加
@EnableScheduling
注解,代表开启定时器,图1。 - 单纯只做一个任务且项目启动时就开始或者延时一段时间开始,在需要做任务的类上添加
@Component
注解,让spring-boot扫码组件,在方法上注解@Scheduled(initialDelay = 1000,fixedDelay = 2000)
第一个参数是延迟多久开始,第二个参数是间隔多久执行一次,图2。 - 如果有多个任务执行,可能需要开线程执行任务,这时只需在任务类上多加一个
@EnableAsync
注解和任务方法上@Async
即可,图3。 - 需要指定时间启动,在任务方法上加
@Scheduled(cron = "0,5 6/1 18 10 8 2")
即可,再根据需要写cron表达式。其中
依次是秒 分 时 天 月 星期(1代表星期1,2代表星期2)
","代表这个和这个都要执行
"/“代表左边这个时间开始,每隔”/"右边的数就执行一次,代表通配,什么都执行
全都为""时,就没过1s执行一次
这是spring的只有6个域,图4。
图1,启动类添加注解
@EnableScheduling
@SpringBootApplication
public class TimApplication {
public static void main(String[] args) {
SpringApplication.run(TimApplication.class, args);
}
}
图2,单个任务,当两个任务同时时,会等待前一个执行完再执行
@Component
public class NoThread {
@Scheduled(initialDelay = 1000,fixedDelay = 2000)
public void pt(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我是pt");
}
@Scheduled(initialDelay = 1000,fixedDelay = 2000)
public void pt1(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我是pt1");
}
}
图3,也是两个任务同时进行,但是采用异步,不用等待前一个执行就可执行
@EnableAsync
@Component
public class Threads {
@Async
@Scheduled(initialDelay = 1000,fixedDelay = 2000)
public void pt(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我是pt2");
}
@Async
@Scheduled(initialDelay = 1000,fixedDelay = 2000)
public void pt1(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我是pt3");
}
}
图4,有定时需求启动时采用,下面的cron代表8月10号周2的下午17点42分0秒和5秒开始输出一次,且开始每过1分钟继续执行
@EnableAsync
@Component
public class cron {
//依次是秒 分 时 天 月 星期(1代表星期1,2代表星期2)
// ","代表这个和这个都要执行
// "/"代表左边这个时间开始,每隔"/"右边的数就执行一次,*代表通配,什么都执行
// 全都为"*"时,就没过1s执行一次
@Scheduled(cron = "0,5 42/1 17 10 8 2")
@Async
public void pt4(){
System.out.println("我是pt4");
}
}