整理一下可以定时执行任务的几个方法
方法一
jdk提供的定时器工具Timer
-
单线程
-
可以指定延迟(开始执行的时间)、周期时间
-
可以调度指定的的需要执行的任务
- 若只执行一次
//指定开始的时间执行一次任务
public void timerOnce(Date startDate) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("operate..");
//终止
timer.cancel();
}
}, startDate);
//这个参数是开始执行的时间,也可以设为延迟的时间,如3000ms
}
- 若有循环周期
public void timerMore() {
// 需要定时执行的任务
TimerTask task = new TimerTask() {
public void run() {
System.out.println("-----定时测试-----");
}
};
// Timer定时器工具
Timer timer = new Timer();
// 延迟(首次执行的时间)
long delay = 0;
// 间隔周期(/毫秒数)
long intevalPeriod = 5 * 1000;
////立即执行,并且每5秒执行一次
timer.scheduleAtFixedRate(task, delay, intevalPeriod);
}
方法二
-
通过线程池的方式来执行任务
-
可以设定时间颗粒度
- TimeUnit.DAYS //天
- TimeUnit.HOURS //小时
- TimeUnit.MINUTES //分钟
- TimeUnit.SECONDS //秒
- TimeUnit.MILLISECONDS //毫秒
- TimeUnit.NANOSECONDS //毫微秒
- TimeUnit.MICROSECONDS //微秒
/**
* ses.scheduleAtFixedRate(执行任务, 延迟(首次执行的时间), 周期, 延迟/周期的单位);
*/
public void timer2() {
// 需要定时执行的任务
Runnable runnable = new Runnable() {
public void run() {
System.out.println("-----定时器-----");
}
};
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
//立即执行,并且每5秒执行一次
ses.scheduleAtFixedRate(runnable, 0, 5000, TimeUnit.MILLISECONDS);
}
方法三
使用springboot注解
- 在主方法入口添加
@EnableScheduling
- 任务调度的方法上面加注解
@Scheduled
-
cron属性:时间表达式
-
fixedRate属性:上一个调用开始后再次调用的延时(再次调用时不需要等上一个调用执行完成)
-
fixedDelay属性:上一个调用完成后再次调用的延时(再次调用时需要等上一个调用执行完成)
-
initialDelay属性:第一次调用时的延迟时间
- 通常情况下,任务调度需要配合异步功能,所以类只需要再添加一个注解
@Async
//second minute hour day_of_month month day_of_week
@Scheduled(cron = "0 * * * * MON-SAT")
@Async
public void hello(){
System.out.println("hello");
}
Comments | 0 条评论