在将来某个指定的时间点或者通过一段时间延迟后执行某个事件,这时候就须要用到定时器了。定时器的实现方式有不少种,今天总结最简单的实现方式。java 1.3引入了定时器框架,用于在定时器上下文中控制线程的执行,其由类Timer和TimerTask构成。Timer适用于大规模并发调度定时任务,在内部,该类使用二进制的堆表示其定时任务队列。java
经过继承TimerTask或者建立匿名类的方式重写run()方法,建立一个定时任务,经过将其做为第一个参数调用Timer得schedule()方法,实现定时器。并发
import java.util.Timer; import java.util.TimerTask; public class TimerDemo { // 经过建立匿名类方式实现 public static void main(String[] args) { // 首先初始化一个TimerTask的匿名子类 TimerTask task = new TimerTask() {
@Override public void run() { System.out.println("开始执行"); //退出程序返回最上层,0表示正常退出程序,非0表示非正常退出程序 System.exit(0); } }; //经过Timer调用 Timer timer = new Timer(); timer.schedule(task, 2000); } }
Timer建立的定时器通常为非线程守护,若是想要建立守护线程需调用Timer(boolean isDaemon) 传递参数true给isDaemon。框架
Timer类声明的方法以下:ide
void scheduleAtFixedRate(TimerTask task, Date firstTime,long period) 调度任务于firstTime开始,以固定速率的方式重复执行,后续将大约period毫秒数的固定时间间隔执行。spa
定时任务都是抽象类TimerTask子类的实例,这些子类实现Runnable接口,当子类实例化TimerTask的时候,须要重写其voud run()方法。线程
TimerTask类声明的方法以下:code
Timer的cancel()和TimerTask的TimerTask的区别在于,Timer的cancel()会终止定时器并放弃当前任意被调度的定时任务,而TimerTask的cancel()方法仅仅会取消正在调度的定时任务。blog