某山寨

z4zr的待调教小窝

java定时器Timer和TimerTask的玩耍

java定时器Timer和TimerTask的玩耍

Java1.5以后带了java.util.Timer与java.util.TimerTask。Timer继承了Object,它用来指定某个时间来执行一项任务,或者每隔一定时间间隔反复执行同一个任务。创建一个Timer后,就会生成一个线程,控制任务的执行。TimerTask是实现某项任务的类,它实现了Runnable接口,相当于一个线程。

调用简介

void Timer.schedule(TimerTask task, long delay)(毫秒)后开始执行任务
void Timer.schedule(TimerTask task, Date time)某个时间开始执行任务
void Timer.schedule(TimerTask task, long delay, long period)delay时间后开始执行任务,每period时间执行一次
void Timer.schedule(TimerTask task, Date firstTime, long period)在指定firstTime时间点执行任务,每period时间执行一次
void Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)delay时间后开始执行任务,每period时间执行一次
void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)在firstTime执行任务,每period时间执行一次
void Timer.cancel()终止此计时器,丢弃所有当前已安排的任务
int Timer.purge()从计时器的任务队列中移除所有已取消的任务
boolean TimerTask.cancel()终止此imerTask

schedule与scheduleAtFixedRate区别:
schedule()用固定延迟调度,在任务执行中的每一个延迟会传播到后续的任
scheduleAtFixedRate()用固定频率调度,所有后续执行根据初始执行的时间进行调度,从而希望减小延迟。如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period。

package timer;
//了解下Quartz,下面的例子根据传智播客的视频弄的
import java.util.Timer;
import java.util.TimerTask;
import java.util.Date;

public class TimerDemo {
  public static void main(String[] args) {
    //new TimerDemo().example1();
    //new TimerDemo().example2();
    //new TimerDemo().example3();
    //new TimerDemo().example4();
    new TimerDemo().example5();
    while (true) {
      System.out.println(new Date().toString());
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * 每10秒炸一次
   */
  public void example1() {
    new Timer().schedule(new TimerTask() {
      
      @Override
      public void run() {
        System.out.println("boom!!!!");
      }
      
    }, 10000);// 调度器(<TimerTask>,毫秒)
  }

  /**
   * 10秒后炸一次,然后每3秒炸一次
   */
  public void example2() {
    new Timer().schedule(new TimerTask() {

      @Override
      public void run() {
        System.out.println("boom!!!!");
      }

    }, 10000, 3000);
  }

  /**
   * 子母炸弹各爆一次,求解释原理
   */
  public void example3() {
    new Timer().schedule(new TimerTask() {

      @Override
      public void run() {
        System.out.println("boom!!!!");
        new Timer().schedule(new TimerTask() {
          
          @Override
          public void run() {
            System.out.println("inner-boom!!!!");
          }
          
        }, 2000);
        
      }

    }, 2000);
  }
  
  class MyTask1 extends TimerTask{

    @Override
    public void run() {
      System.out.println("boom!!!!");
      new Timer().schedule(new MyTask1(), 2000);
    }
    
  }
  /**
   * 每2秒炸一次
   */
  public void example4(){
    new Timer().schedule(new MyTask1(), 2000);
  }
  
  
  private static int cnt=0;
  class MyTask2 extends TimerTask{

    @Override
    public void run() {
      cnt = (cnt+1)%2;
      System.out.println("boom!!!!");
      new Timer().schedule(new MyTask2(), 2000+2000*cnt);
    }
    
  }
  /**
   * 2秒炸一次,4秒炸一次 循环
   */
  public void example5(){
    new Timer().schedule(new MyTask2(), 2000);
  }
}

link1

文章二维码