1.在启动类配置开启Scheduling Task
2. 配置定时任务
3. 测试
启动SpringBoot的启动类
这个定时任务每五秒执行了一次
由此可见@Scheduled注解的fixRate是指定定时任务的运行间隔,即执行的频率
4.@Scheduled注解的字段
4.1 CRON_DISABLED
用于表示禁止使用Corn表达式
Corn表达式是一一种用于表达时间表的表达式,多用于定时任务规则的指定
4.2 cron
用于指定Cron表达式
4.3 zone
用于指定时区,默认是空串,表示使用默认时区
4.4 fixedRateString
作用与fixedRate相同,只不过是用字符串指定
执行结果依然是每5s执行一次
4.5 fixedDelay
当前任务执行完毕后,延迟指定的时间后才会开始执行下一次任务
4.6 initialDelay
用于配置第一次任务开始之前的延迟时间
5. Scheduling Tasks默认是单线程
定义两个任务
@Component
public class Task {
@Scheduled(fixedRateString = "5000")
public void shout1() throws InterruptedException {
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
Date now = new Date();
while (true) {
Thread.sleep(1000);
System.out.println(sdf.format(now) + " 任务1发出声响:" + "啊啊啊啊!!!!");
}
}
@Scheduled(fixedRateString = "5000")
public void shout2() throws InterruptedException {
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
Date now = new Date();
while (true) {
Thread.sleep(1000);
System.out.println(sdf.format(now) + " 任务2发出声响:" + "啊啊啊啊!!!!");
}
}
}
由于默认是单线程,shout1没有执行完,占有着线程,shout2无法执行。
5.1 设置线程数
5.1.1 @Bean设置
@Configuration
public class TaskConfig {
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler tps = new ThreadPoolTaskScheduler();
tps.setPoolSize(5);
return tps;
}
}
5.1.2 实现SchedulingConfigurer接口
@Configuration
public class TaskConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler tps = new ThreadPoolTaskScheduler();
tps.setPoolSize(5);
tps.initialize();
taskRegistrar.setTaskScheduler(tps);
}
}
5.1.3 一个线程处理一个任务
虽然我们可以设置多个线程来处理任务,但是对于一个任务,只会分配一个线程去处理任务。
注释掉任务2,只保留任务1
依然保持线程池大小为5
运行结果:
可以看到虽然设置了线程数是5,当我们设置的的定时时间到了之后,之前的任务还没有完成, 也不会使用新的线程来处理任务。