1.启动类加上注解 @EnableScheduling 开启定时任务
2.编写task类,类上加上注解 @Component
3.编写方法加上注解 @Scheduled(fixedRate = 3000)
一个简单的定时任务完成
定时任务的三种方式:
1.fixedRate 固定频率任务:定义每过3秒执行任务,假设run()方法在第0秒开始执行,方法执行了12秒,那么下一次执行work()方法的时间是第12秒
@Scheduled(fixedRate = 3000)
public void run() throws InterruptedException {
long start = System.currentTimeMillis();
System.out.println("每隔3s执行一次,线程名称:" + Thread.currentThread().getName());
Thread.sleep(5000);
long end = System.currentTimeMillis();
System.out.println("执行rate完毕,:" + Thread.currentThread().getName());
}
2.fixedDelay固定间隔任务:下一次的任务执行时间,是从方法最后一次任务执行结束时间开始计算。并以此规则开始周期性的执行任务,假设run2()方法在第0秒开始执行,方法执行了10秒,那么下一次执行work()方法的时间是第15秒
@Scheduled(fixedDelay = 5000)
public void run2()throws Exception{
long start = System.currentTimeMillis();
System.out.println("固定5s执行,线程名称:" + Thread.currentThread().getName());
Thread.sleep(6000);
long end = System.currentTimeMillis();
System.out.println("执行delay完毕,:" + Thread.currentThread().getName());
}
3.Cron表达式:当方法的执行时间超过任务调度频率时,调度器会在下个周期执行。 秒 分 时 日 月 星期
0/10 * * * * * 每30s执行一次 * 0/5 * * * * 每5分钟执行一次 0 0 0 * * * 每天零点执行
0 0 8,,12,17 * * * 每天8,12,17点整执行 0 30 3-5 * * * 每天3到5点30分执行
@Scheduled(cron = "0/10 * * * * *")
public void run3() throws Exception{
System.out.println("每10秒执行一次,线程名称:" + Thread.currentThread().getName());
Thread.sleep(12000);
System.out.println("执行cron完毕~~~~:" + Thread.currentThread().getName());
}
关于定时任务的串行和并行
串行任务:必须等上一个任务完成才能执行下一个任务,任务之间执行不稳定,执行没有顺序和规律,默认情况下是串行任务
并行任务:多个定时任务同时执行,需要配置TaskScheduler,因为TaskScheduler默认的线程数为1
什么都不做的情况下就是串行任务,对于需要同时执行的任务来说不适用,那么如何让定时任务并行执行?
只需要添加一个配置其他什么都不变就行了
@Configuration
public class TaskSchedulerThreadConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(5);
return taskScheduler;
}
}