什么是定时任务调度?
基于给定的时间点、时间间隔、执行次数自动执行任务
主要构件
Timer和TimerTask
Timer函数
cancel() 终止此计时器,丢弃所有当前已安排的任务
purge() 返回从队列中移除的任务数
schedule函数
schedule(task, time) 在时间等于或超过time(time早于当前时间)的时候执行且仅执行一次
schedule(task, time, period) 在time时首次执行,接下来每隔period就执行一次
schedule(task, delay) 比当前时间推迟delay秒且仅执行一次
schedule(task, delay, period) 在time时首次执行,接下来每隔period就执行一次scheduleAtFixedRate(task, time, period)
scheduleAtFixedRate(task, delay, period)cancel() 取消当前TimerTask里的任务
scheduleExecutionTime() 返回最近执行此任务的时间,long型schedule与scheduleAtFixedRate的区别:
一、当首次执行时间早于当前时间的情况下(time为00:00:00,当前时间为00:00:06):1.schedule:如果第一次执行的时间早于当前时间,则第一次执行的时间
等于当前时间,从当前时间开始执行。
2.scheduleAtFixedRate:如果第一次执行的时间早于当前时间,则会
把早出来的时间间隔内能执行的次数给弥补上,并为了赶上进度使用了
同步,多次执行任务,因此run方法内要考虑同步问题。1.schedule:下次的执行时间等于上次执行完成时间,因此执行时间不断延后,
也就是说我们设置的period已经失效,以任务完成时间为准执行下个任务。
2.scheduleAtFixedRate:下次的执行时间等于上次开始执行任务的时间加上period,
不会延后,存在并发性总结一下,就是scheduleAtFixedRate严格遵守我们设置的time和period,固定不变,但是我们
要注意scheduleAtFixedRate存在并发问题,在run方法里该加锁的地方要加锁。1.管理并发任务的缺陷
Timer有且仅有一个线程去执行定时任务,如果存在多个执行周期较长的任务,会导致执行效果与预期不符,比如不能同时执行一个任务。
2.当任务抛出异常时的缺陷
如果TimerTask抛出RuntimeException,Timer会停止所有任务的运行
1.对时效性要求较高的多任务并发作业
2.对复杂的任务的调度,因为一旦抛出异常就结束所有任务,且Timer基于时间,不能基于日历,比如星期,日,月等
简单例子
1.写一个类继承TimerTask,重写run方法
package timerTest;
import java.util.TimerTask;
/**
* writer: holien
* Time: 2017-07-30 23:25
* Intent: 任务类
*/
public class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("timerTask has been done");
}
}
2.写一个Timer类调用MyTimerTask
package timerTest;
import java.util.Timer;
import java.util.TimerTask;
/**
* writer: holien
* Time: 2017-07-30 23:24
* Intent: 调度器类
*/
public class MyTimer {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new MyTimerTask(), 2000L, 1000L);
// 若业务逻辑较简单,直接使用匿名内部类重写run方法
// timer.schedule(new TimerTask() {
// @Override
// public void run() {
// System.out.println("job has been executed...");
// }
// }, 2000L, 1000L);
}
}
在综合标签里记录了quartz的学习,点我打开quartz学习记录