日常实现各种服务端系统时,我们一定会有一些定时任务的需求。比如会议提前半小时自动提醒,异步任务定时/周期执行等。那么如何去实现这样的一个定时任务系统呢? 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)
基本的使用方法:
加入任务的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);
}
// 指定时延后运行,之后以指定周期运行
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,
long period) {
if (period <= 0)
throw new IllegalArgumentException("Non-positive period.");
sched(task, firstTime.getTime(), period);
}
可以看到API方法内部都是调用sched
方法,其中time
参数下一次任务执行时间点,是通过计算得到。period
参数为0的话则表示为一次性任务。
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。