20181105 Timer(慕课网)
定时任务调度
基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务
Java中的定时调度工具
- Timer
JDK提供,无需引入
功能简单,能用Timer尽量用
- Quartz
需要引入
功能复杂,Timer不能解决时使用
Timer的定义
有且仅有一个后台线程对多个业务线程进行定时定频率的调度
关键类:java.util.Timer 、 java.util.TimerTask
Timer的基本使用
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(new Date());
}
}, 2000L, 1000L);
重要函数
Timer
schedule // 定时执行
scheduleAtFixedRate // 定时执行,某些情况下不同于schedule
cancel // 终止此计时器,丢弃所有当前已安排的任务
purge // 从此计时器的任务队列中移除所有已取消的任务
TimerTask
cancel // 取消当前TimerTask里的任务
scheduledExecutionTime // 返回此任务最近实际执行的已安排执行的时间
Timer的schedule
和scheduleAtFixedRate
的区别
- 首次计划执行的时间早于当前的时间
- schedule
"fixed-delay":如果第一次执行时间被delay了,随后的执行时间按照上一次实际执行完成的时间点进行计算
- scheduleAtFixedRate
"fixed-rate": 如果第一次执行时间被delay了,随后的执行时间按照上一次开始的时间点进行计算,而且为了赶上进度会多次执行任务,因此TimeTask中的执行体需要考虑同步
- 任务执行所需时间超出任务的执行周期间隔
- schedule
下一次执行时间相对于上一次实际执行完成的时间点,因此执行时间会不断延后
- scheduleAtFixedRate
下一次执行时间相对于上一次开始的时间点,因此执行时间一般不会延后,因此存在并发性
Timer的缺陷
- 管理并发任务的缺陷
Timer有且仅有一个线程去执行定时任务,如果存在多个任务,且任务时间过长,会导致执行效果与逾期不符
- 当任务抛出异常时的缺陷
如果TimerTask抛出RuntimeException,Timer会停止所有任务的运行
Timer的使用禁区
- 对时效性要求较高的多任务并发作业
- 对复杂的任务的调度
参考资料
- Java定时任务调度工具详解之Timer篇
- JDK官方文档