我们为什么需要定时调度?
程序定时自动执行任务,这个功能听起来就非常棒。而且在实际场景中,经常会出现需要凌晨、或者每过五分钟就执行的任务,如果需要人一直守着来触发,得多么痛苦呀。
这时候,使用定时调度任务来完成,放心可靠又轻松。
Timer/TimerTask
使用Java提供的Timer类与TimerTask抽象类,可以实现任务的定时调度。
需要执行的任务类继承TimerTask抽象类,并重写run()方法,将任务需要进行的代码操作放在run()方法中。
通过实例化Timer对象,调用对象的schedule方法,安排定时调度的时间和次数等参数。Timer的常用构造器如下:
Timer对象的常用方法如下:
方法 | 说明 |
---|---|
cancel() | 终止此计时器,丢弃任何当前计划的任务。 |
purge() | 从该计时器的任务队列中删除所有取消的任务。 |
schedule(TimerTask task, long delay) | 在指定的延迟之后安排指定的任务执行。 |
schedule(TimerTask task, Date time) | 在指定的时间安排指定的任务执行。 |
schedule(TimerTask task, Date firstTime, long period) | 从指定的第一次执行时间开始 ,对指定的任务执行重复的 固定延迟执行 。 |
schedule(TimerTask task, long delay, long period) | 在指定 的延迟之后开始 ,重新执行 固定延迟执行的指定任务。 |
scheduleAtFixedRate(TimerTask task, Date firstTime, long period) | 从指定的时间 开始 ,对指定的任务执行重复的 固定速率执行 。 |
scheduleAtFixedRate(TimerTask task, long delay, long period) | 在指定的延迟之后 开始 ,重新执行 固定速率的指定任务。 |
其中,固定延迟和固定速率的区别是:
- 固定延迟:上一次任务执行完毕后,下一次执行时间间隔是固定的。如果上一次执行时间较长,也会一直等着上一次执行结束,并且后续执行也将被延迟。
- 固定速率:相对于初始执行的预定执行时间调度每个执行。 如果上一个由于任何原因延迟执行,则后面的执行会两次或多次执行快速连续发生以“追赶”。,来补上缺失的执行次数。
使用实例:
public class Test {
public static void main(String[] args) {
Timer timer = new Timer("Timer1");
// 执行安排
// timer.schedule(new Job1(), 1000); //1000毫秒后,执行任务一次
//timer.schedule(new Job1(), 1000,1000*60); //1000毫秒后,每分钟执行一次
String date_str = "2020-04-01 18:32:00";
Date date = null;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
simpleDateFormat.format(new Date());
try {
date = simpleDateFormat.parse(date_str);
} catch (ParseException e) {
e.printStackTrace();
}
//timer.schedule(new Job1(), date, 1000*5); // 指定时间,每5秒执行一次。如果当前时间已经超过指定时间,则会立马执行一次
timer.scheduleAtFixedRate(new Job1(),date, 1000*5);
}
}</