一、背景和使用
日常实现各种服务端系统时,我们一定会有一些定时任务的需求。比如会议提前半小时自动提醒,异步任务定时/周期执行等。那么如何去实现这样的一个定时任务系统呢? Java JDK提供的Timer
类就是一个很好的工具,通过简单的API调用,我们就可以实现定时任务。
现在就来看一下java.util.Timer是如何实现这样的定时功能的。
首先,我们来看一下一个使用demo
Timer timer = new Timer();
TimerTask task = new TimerTask() {
public void run() {
System.out.println("executing now!");
}
};
// 延迟 1s 打印一次
timer.schedule(task, 1000)
// 延迟 1s 固定时延每隔 1s 周期打印一次
timer.schedule(task, 1000, 1000);
// 延迟 1s 固定速率每隔 1s 周期打印一次
timer.scheduleAtFixRate(task, 1000, 1000)
复制代码
基本的使用方法:
- 创建一个Timer对象
- 创建一个TimerTask对象,在这里实现run方法
- 将TimerTask对象作为参数,传入到Timer对象的scheule方法中,进行调度执行。
加入任务的API如下:
- 一次性任务的API
// 指定时延后运行
// 默认fixed-delay模式,周期时间按上一次执行结束时间计算
public void schedule(TimerTask task, long delay) {
if (delay < 0)
throw new IllegalArgumentException("Negative delay.");
sched(task, System.currentTimeMillis()+delay, 0);
}
// 指定时间点运行
public void schedule(TimerTask task, Date time) {
sched(task, time.getTime(), 0);
}
复制代码
- 周期任务的APi:
// 指定时延后运行,之后以指定周期运行
public void schedule(TimerTask task, long delay, long period) {
if (delay < 0)
throw new IllegalArgumentException("Negative delay.");
if (period <= 0)
throw new IllegalArgumentException("Non-positive period.");
sched(task, System.currentTimeMillis()+delay, -period);
}
// 指定时间点运行,之后以指定周期运行
public void schedule(TimerTask task, Date firstTime, long period) {
if (period <= 0)
throw new IllegalArgumentException("Non-positive period.");
sched(task, firstTime.getTime(), -period);
}
// 指定时延后运行,之后以指定周期运行
// 默认fixedRate模式,周期时间按任务执行开始时间计算
public void scheduleAtFixedRate(TimerTask task, long delay, long period) {
if (delay < 0)
throw new IllegalArgumentException("Negative delay.");
if (period <= 0)
throw new IllegalArgumentException("Non-positive period.");
sched(task, System.currentTimeMillis()+delay, period);
}
public void scheduleAtFixedRate(TimerTask task, Date firstTime,
l