多线程定时任务就是在基于注解时限基础上就已修改,很简单。
重点在于几个注解
用于类名上
@EnableScheduling // 1.开启定时任务
@EnableAsync // 2.开启多线程
用于方法名上
@Async
@Scheduled(fixedDelay = 1000) //间隔1秒
以下是代码示例
@Component
@EnableScheduling // 1.开启定时任务
@EnableAsync // 2.开启多线程
public class MultithreadScheduleTask {
@Async
@Scheduled(fixedDelay = 1000) //间隔1秒
public void first() throws InterruptedException {
System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
System.out.println();
Thread.sleep(1000 * 10);
}
@Async
@Scheduled(fixedDelay = 2000)
public void second() {
System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
System.out.println();
}
}
关于时间的配置有两种,用于注解@Scheduled上:
Cron表达式:
秒(0~59) 例如0/5表示每5秒
分(0~59)
时(0~23)
日(0~31)的某天,需计算
月(0~11)
周几( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)
Cron表达式范例:
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
@Scheduled(cron = "0/5 * * * * ?")
@Scheduled:除了支持灵活的参数表达式cron之外,还支持简单的延时操作,例如 fixedDelay,fixedRate 填写相应的毫秒数即可。
fixedRate=2000表示每两秒就要执行一次,但是代码执行就需要三秒,那么这时候,就是三秒执行一次,代码执行小于2秒,那就是两秒运行一次,相当于代码块开始执行就开始计时了
fixedDelay,这里表示,代码执行完后,在执行定时的时间2秒,这里相当于这个任务需要5秒执行一次,定时的2秒加上,代码执行的时间3秒,相当于,代码块执行结束了才开始计时
@Scheduled(fixedDelay = 1000)