今天看到定时任务, 自己也试了试手 挺好用 谈谈自己的见解, 顺便记录一下, 笔记
一.Spring Task简介
1.定时任务
3.三种完成方法
1.java自带的API java.util.Timer类 java.util.TimerTask类
2.Quartz框架 开源 功能强大 使用起来稍显复杂
3.Spring 3.0以后自带了task 调度工具,比Quartz更加的简单方便(本文章介绍)
二.简单使用
启动类配置 @EnableScheduling //开启任务调度
@Component
public class SpringTaskTest {
int a = 0;
@Scheduled(cron = "0/3 * * * * *")//每隔三秒去执行
public void teak() throws InterruptedException {
long startTime = System.currentTimeMillis();//记录开始运行时间
System.out.println("程序运行开始");
a += 1;
System.out.println("执行第 :" +a +"几次==========================");
Thread.sleep(5000);
long endTime = System.currentTimeMillis();//记录结束运行时间
System.out.println("程序运行结束时间:" + (endTime - startTime) + "ms");
}
}
运行结果
程序运行开始
执行第 :1几次==========================
程序运行结束时间:2000ms
程序运行开始
执行第 :2几次==========================
程序运行结束时间:2000ms
程序运行开始
执行第 :3几次==========================
程序运行结束时间:2001ms
每次执行完就会跟进新任务, 如果试着 Thread.sleep(5000); 大于要等待的三秒执行会怎样?
结果是任务开始后要等待三秒才会执行下次任务, 但是因为上次任务还没执行完所以会等待任务执行完后才回去执行下次任务.
三.注解部分参数:
@Scheduled(fixedRate = 3000)//任务开始后3秒执行下次任务
@Scheduled(fixedDelay = 3000)//任务结束3秒后执行下次任务
cron表达式:
cron表达式包括6部分:
秒(0~59)
分钟(0~59)
小时(0~23)
月中的天(1~31)
月(1~12)
周中的天 (填写MON,TUE,WED,THU,FRI,SAT,SUN,或数字1~7 1表示MON,依次类推)
特殊字符介绍:
“/”字符表示指定数值的增量
“*”字符表示所有可能的值 “-”字符表示区间范围 “,” 字符表示列举
“?”字符仅被用于月中的天和周中的天两个子表达式,表示不指定值
举几个例子:
每天的十点执行一个任务怎么写
(cron = “0 0 10 * * *”)
每周一到周三的十点五十二分三十六执行一个任务怎么写
(cron = "36 52 10 ? * 1-3 ")
因为不知道每个星期的周一到周三是每个月份的几号所以要在月中的天的位置加上?只能保留一种
串行任务:
默认就是串行
执行代码:
@Component
public class SpringTaskTest {
int a = 0;
@Scheduled(cron = "0/3 * * * * *")//每隔三秒去执行
// @Scheduled(fixedRate = 3000)//任务开始后3秒执行下次任务
// @Scheduled(fixedDelay = 3000)//任务结束3秒后执行下次任务
public void teak() throws InterruptedException {
long startTime = System.currentTimeMillis();//记录开始运行时间
System.out.println("teak\t程序运行开始");
a += 1;
System.out.println("执行第 :" +a +"几次==========================");
Thread.sleep(2000);
long endTime = System.currentTimeMillis();//记录结束运行时间
System.out.println("程序运行结束时间:" + (endTime - startTime) + "ms");
}
@Scheduled(cron = "0/3 * * * * *")//每隔三秒去执行
// @Scheduled(fixedRate = 3000)//任务开始后3秒执行下次任务
// @Scheduled(fixedDelay = 3000)//任务结束3秒后执行下次任务
public void teak2() throws InterruptedException {
long startTime = System.currentTimeMillis();//记录开始运行时间
System.out.println("teak2\t程序运行开始");
a += 1;
System.out.println("执行第 :" +a +"几次==========================");
Thread.sleep(2000);
long endTime = System.currentTimeMillis();//记录结束运行时间
System.out.println("程序运行结束时间:" + (endTime - startTime) + "ms");
}
}
运行结果
teak 程序运行开始
执行第 :1几次==========================
程序运行结束时间:2000ms
teak2 程序运行开始
执行第 :2几次==========================
程序运行结束时间:2000ms
teak 程序运行开始
执行第 :3几次==========================
程序运行结束时间:2001ms
teak2 程序运行开始
执行第 :4几次==========================
程序运行结束时间:2001ms
并行任务
配置任务的线程池
@Configuration
public class AsyTaskConfig implements SchedulingConfigurer, AsyncConfigurer {
private int corePoolSize = 5;//线程池数量
@Bean
public ThreadPoolTaskScheduler taskScheduler()
{
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();//初始化线程池
scheduler.setPoolSize(corePoolSize);//线程池容量
return scheduler;
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setTaskScheduler(taskScheduler());
}
}
任务代码
@Component
public class SpringTaskTest {
int a = 0;
@Scheduled(cron = "0/3 * * * * *")//每隔三秒去执行
// @Scheduled(fixedRate = 3000)//任务开始后3秒执行下次任务
// @Scheduled(fixedDelay = 3000)//任务结束3秒后执行下次任务
public void teak() throws InterruptedException {
long startTime = System.currentTimeMillis();//记录开始运行时间
System.out.println("teak\t程序运行开始");
a += 1;
System.out.println("执行第 :" +a +"几次==========================");
Thread.sleep(2000);
long endTime = System.currentTimeMillis();//记录结束运行时间
System.out.println("程序运行结束时间:" + (endTime - startTime) + "ms");
}
@Scheduled(cron = "0/3 * * * * *")//每隔三秒去执行
// @Scheduled(fixedRate = 3000)//任务开始后3秒执行下次任务
// @Scheduled(fixedDelay = 3000)//任务结束3秒后执行下次任务
public void teak2() throws InterruptedException {
long startTime = System.currentTimeMillis();//记录开始运行时间
System.out.println("teak2\t程序运行开始");
a += 1;
System.out.println("执行第 :" +a +"几次==========================");
Thread.sleep(2000);
long endTime = System.currentTimeMillis();//记录结束运行时间
System.out.println("程序运行结束时间:" + (endTime - startTime) + "ms");
}
}
执行结果
teak 程序运行开始
执行第 :1几次==========================
teak2 程序运行开始
执行第 :2几次==========================
程序运行结束时间:2001ms
程序运行结束时间:2001ms
teak2 程序运行开始
执行第 :3几次==========================
teak 程序运行开始
执行第 :4几次==========================
程序运行结束时间:2000ms
程序运行结束时间:2000ms
teak2 程序运行开始
执行第 :5几次==========================
teak 程序运行开始
执行第 :6几次==========================
程序运行结束时间:2000ms
程序运行结束时间:2000ms