用Java创建重复计时器提醒

SIM*_*MEL 10 java timer

我希望有一个类每2秒更改一次自己的私有变量.我知道,如果我做了类似的事情

import java.util.Timer;
//...
Timer timer;
//...
timer.schedule(new ChangeSomething(), 2000);
Run Code Online (Sandbox Code Playgroud)

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

    timer.schedule(new ChangeSomething(), 2000);
Run Code Online (Sandbox Code Playgroud)

它会起作用吗?

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

hmj*_*mjd 12

使用timer.scheduleAtFixedRate()安排它每两秒钟复发:

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

从javadoc Timer.cancel():

终止此计时器,丢弃当前计划的任何任务.不干扰当前正在执行的任务(如果存在).一旦计时器终止,其执行线程将正常终止,并且不再可以在其上安排任何任务.

编辑:

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

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


小智 6

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

import java.util.Timer;
//...
Timer timer;
//...
timer.scheduleAtFixedRate(new ChangeSomething(), 2000, 2000);
Run Code Online (Sandbox Code Playgroud)

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


bar*_*rdh 6

这是一个例子

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();
  }
Run Code Online (Sandbox Code Playgroud)

}