用Java创建重复计时器提醒

时间:2012-01-29 13:05:34

标签: java timer

我希望有一个类每2秒更改一次自己的私有变量。我知道如果我做了像

这样的事情
import java.util.Timer;
//...
Timer timer;
//...
timer.schedule(new ChangeSomething(), 2000);

它会在2秒后执行ChangeSomething(),有没有办法告诉它每2秒做一次,或者,如果我放入ChangeSomething()

    timer.schedule(new ChangeSomething(), 2000);

会起作用吗?

另一方面,timer.cancel()究竟做了什么?

4 个答案:

答案 0 :(得分:11)

使用timer.scheduleAtFixedRate()安排它每两秒重复一次:

  

从指定时间开始,为重复的固定速率执行计划指定的任务。随后的执行大约定期进行,以指定的时间段分开。

来自Timer.cancel()的javadoc:

  

终止此计时器,丢弃当前计划的任何任务。不干扰当前正在执行的任务(如果存在)。一旦计时器终止,它的执行线程就会正常终止,并且不再安排任何任务。

编辑:

关于执行单个任务一次的Timer的内部执行线程:

  

在对Timer对象的最后一次实时引用消失并且所有未完成的任务都已完成执行之后,计时器的任务执行线程正常终止(并且变为垃圾回收)。但是,这可能会发生任意长的时间。默认情况下,任务执行线程不作为守护程序线程运行,因此它能够阻止应用程序终止。如果调用者想要快速终止计时器的任务执行线程,则调用者应该调用计时器的cancel方法。

答案 1 :(得分:6)

您需要调用Timer的其他调度方法,称为scheduleAtFixedRate(...),它可以获得3个参数。前两个与您使用的时间表相同,而第三个参数表示连续任务执行之间的时间间隔(以毫秒为单位)。

import java.util.Timer;
//...
Timer timer;
//...
timer.scheduleAtFixedRate(new ChangeSomething(), 2000, 2000);

您可以在此处查看此方法的java pai文档:http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html#scheduleAtFixedRate(java.util.TimerTask,java.util.Date,long)

答案 2 :(得分:3)

这是一个例子

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Test extends TimerTask {
   private int age;

   public Test() {
       Timer timer = new Timer();
       timer.scheduleAtFixedRate(this, new Date(), 2000);
   }

   /**
    * Implements TimerTask's abstract run method.
    */
    public void run(){
      //toy implementation
      System.out.print("Changing Data ... before change age is "+age+" ");
      changeAge();
      System.out.println("after change age is "+age);

    }


   private void changeAge() {
      age = (int)Math.round(Math.random()*1000);
   }

  public static void main(String[] args) {
          new Test();
  }

}

答案 3 :(得分:0)

在这里更精确:ChangeSomething()是ChangeSomething类的构造函数。将ChangeSomething instace对象传递给计时器时,构造函数将立即执行,而不是在2秒之后。它会在2秒后触发对象的run()方法。

要在2秒内重复执行该run()方法,请使用schedule(TimerTask task, long delay, long period)