现有两个定时任务
@Component
public class A {
@Scheduled(cron = "0 44 17 * * ?")
public void a() {
try {
System.out.println("a执行时间:" + new Date());
Thread.sleep(65000);
System.out.println("a完成时间:" + new Date());
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Component
public class B {
@Scheduled(cron = "0 55 17 * * ?")
public void b() {
try {
System.out.println("b执行时间:" + new Date());
Thread.sleep(10000);
System.out.println("b完成时间:" + new Date());
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后定时任务启动需要加上 @EnableScheduling
注解才能生效,而这个注解可以直接加在该定时任务的类上,也可以加在启动类上,一般我比较喜欢加在启动类上,因为当任务多的时候就不需要频繁在定时任务的类上加注解了,如下:
@SpringBootApplication
@EnableScheduling
public class TaskApplication {
public static void main(String[] args) {
SpringApplication.run(TaskApplication.class, args);
}
}
上面的定时任务由于A的任务执行时间超过了B的开始执行时间并且是单线程执行任务,所以B的定时任务被阻塞掉了,解决方法是在启动类中加入一个定时任务的线程池,代码如下:
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(50);
return taskScheduler;
}