- 定时任务在做开发的时候都会用到,特别在接口中。
- 下面介绍下Java自带的定时器
使用方法介绍
- Timer timer=new Timer(true);//设置为守护线程 不设置的话线程会一直存在的
- 在指定的延迟后安排指定的任务执行。
- Timer.schedule(TimerTask task, long delay)
- 在指定的延迟之后开始,为重复的固定延迟执行安排指定的任务。
- Timer.schedule(TimerTask task, long delay, long period)
- 计划在指定时间执行指定的任务。
- Timer.schedule(TimerTask task, Date time)
- 从指定时间开始,为重复的 固定延迟执行 安排指定的任务。
- Timer.schedule(TimerTask task, Date firstTime, long period)
- 在指定的延迟之后开始,为重复的 固定速率执行安排指定的任务
- Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)
- 从指定时间开始,为重复的 固定延迟执行 安排指定的任务
- Timer.scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
入门demo
public class TestTimer extends TimerTask{ @Override public void run() { System.out.println("定时器执行了"); } public static void main(String[] args) throws InterruptedException { TestTimer tt=new TestTimer(); Timer timer=new Timer(true); // timer.schedule(tt, 10); // timer.schedule(tt, 10,10); // timer.schedule(tt, new Date()); // timer.schedule(tt, new Date(),10); // timer.scheduleAtFixedRate(tt, 10, 10); timer.scheduleAtFixedRate(tt, new Date(), 10); Thread.sleep(10000); } } 复制代码
注意事项
- 创建一个 Timer 对象相当于新启动了一个线程
- 当TimerTask 抛出异常后 定时任务将不再执行
- 当timer设置的时间提前的话,会立即执行
- this.cancel(); 移除当前的定时任务,这里可以用作线程的终止,重启可以重新调用
- timer.cancel();移除当前timer的所有定时任务
- 没有延时schedule会参考上次执行的开始时间、而scheduleAtFixedRate会参考上次执行的结束时间
- 如果有延时的时候都会参照上次结束时间的,schedule向后延时,scheduleAtFixedRate会选择就近原则 执行
- 一个Timer内部包装了一个Thread和一个Task队列,里面会轮询执行的。当队列为空等待结束后,当前的定时器也就结束了