网络上关于java定时器的文章真的是错误百出,给我的学习造成了很大的困扰,Timer根本就没有线程安全问题,Timer的所有调度方法都和上次任务的结束时间没有关系,TImer和ScheduledThreadPoolExecutor当任务执行时间大于间隔时间的时候,该task不存在前一次执行还没结束,就再启动执行的情况。只有ScheduledThreadPoolExecutor对该task执行了多次schedulexxx方法、或者多个Timer schedule同一个task,会造成该task的并发。最后通过看源码做测试的方法整理了一些要点。
定时器Timer
Timer的作用是设置定时任务,但封装任务的类是TimerTask,需要程序员继承TimerTask这个抽象类,实现run()方法,放入自己的业务代码。
Timer的常用方法
- Timer timer = new Timer()
构造TImer定时器,可以传入boolean参数,true将定时任务设置为守护线程,无参则不设置
- 构建TimerTask实例
一般都是使用匿名类
TimerTask task = new TimerTask() {
public void run() {
... //每次需要执行的业务代码
cancel();//可以让该task退出调度
}
};
- cancel取消全部定时任务
和TimerTask的cancel不同,将全部定时任务都取消
- schedule调度定时任务
timer.schedule(task, time)
time为Date类型:在指定时间执行一次。
timer.schedule(task, delay)
delay 为long类型,不能小于0,从现在起过delay毫秒执行一次
timer.schedule(task, firstTime, period)
firstTime为Date类型,period为long,从firstTime时刻开始,每隔period毫秒执行一次