在平常的开发中很多时候我们都有用到定时任务,而springboot也为我们提供了注解式定时任务
1.启动类
@EnableScheduling //开启定时任务扫描 让springboot找到有定时任务注解的方法
@SpringBootApplication
public class ATestDemo1Application {
public static void main(String[] args) {
SpringApplication.run(ATestDemo1Application.class, args);
}
}
2.定时任务
@Service
public class TestService {
@Scheduled(fixedRate = 2000) //2秒执行一次
public void testScheduler01(){
System.out.println("testScheduler01----->"+Thread.currentThread().getName());
}
@Scheduled(fixedRate = 2000)
public void testScheduler02(){
System.out.println("testScheduler02----->"+Thread.currentThread().getName());
}
}
在这里我们的定时任务就已经准备完成了,启动程序后会按照指定规则执行方法,在这里我们打印两个方法说执行的线程名,会发现是同一个线程,springboot定时任务默认的是单线程执行,在上一个任务没有完成的情况下会阻塞下一个任务。
3.实现多线程定时任务
两种实现方法
3.1创建一个TaskScheduler线程池并交给容器管理
@Configuration
public class ScheduleConfig {
@Bean
public TaskScheduler taskScheduler(){
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
//设置并发为10
scheduler.setPoolSize(10);
return scheduler;
}
}
3.2实现SchedulingConfigurer接口,重写configureTasks方法给它set进一个线程池
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
//设定一个长度10的定时任务线程池
scheduledTaskRegistrar.setScheduler(new ScheduledThreadPoolExecutor(10));
}
}
两种方法选取一个即可
4.@Scheduled中的参数说明:
@Scheduled(fixedRate=2000):上一次开始执行时间点后2秒再次执行;
@Scheduled(fixedDelay=2000):上一次执行完毕时间点后2秒再次执行;
@Scheduled(initialDelay=1000, fixedDelay=2000):第一次延迟1秒执行,然后在上一次执行完毕时间点后2秒再次执行;
@Scheduled(cron="* * * * * ?"):按cron规则执行。