这里写目录标题
18.3 定时任务的那些陷阱
本节探讨定时任务,定时任务的应用场景是非常多的,比如:
·闹钟程序或任务提醒,指定时间叫床或在指定日期提醒还信用卡。
·监控系统,每隔一段时间采集下系统数据,对异常事件报警。
·统计系统,一般凌晨一定时间统计昨日的各种数据指标。
在Java中,主要有两种方式实现定时任务:
·使用java.util包中的Timer
和TimerTask
。
·使用Java并发包中的ScheduledExecutorService
。
它们的基本用法都是比较简单的,但如果对它们没有足够的了解, 则很容易陷入其中的一些陷阱。下面,我们就来介绍它们的用法、原理 以及那些陷阱。
18.3.1 Timer和TimerTask
我们先介绍它们的基本用法和示例,然后介绍它们的实现原理和一 些注意事项。
1.基本用法
TimerTask
表示一个定时任务,它是一个抽象类,实现了 Runnable
,具体的定时任务需要继承该类,实现run方法。Timer
是一个具体类,它负责定时任务的调度和执行,主要方法有:
需要注意固定延时(fixed-delay
)与固定频率(fixed-rate
)的区别,二者都是重复执行,但后一次任务执行相对的时间是不一样的,对于固定延时,它是基于上次任务的“实际”执行时间来算的, 如果由于某种原因,上次任务延时了,则本次任务也会延时,而固定频