Создание повторяющегося напоминания таймера в Java

Я хочу иметь класс, который меняет собственный переменные каждые 2 секунды. Я знаю, что если я сделаю что-то вроде

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

он выполнит ChangeSomething() через 2 секунды, есть ли способ сказать ему что-то делать каждые 2 секунды, или, если я положил внутрь ChangeSomething()

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

будет ли она работать?

на боковой ноте, что делает timer.cancel() точно?

4 ответов


использовать timer.scheduleAtFixedRate() чтобы запланировать его повторять каждые две секунды:

планирование указанной задачи для повторного выполнения фиксированной ставки, начиная с указанного времени. Последующие казни происходят примерно через равные промежутки времени, разделенные указанным периодом.

из javadoc для Timer.cancel():

завершает этот таймер, отбрасывая все текущие запланированные задачи. Не препятствует выполнению текущей задачи (если он существует). После завершения таймера его поток выполнения завершается изящно, и на нем больше не могут быть запланированы задачи.

EDIT:

относящийся к внутреннему потоку выполнения для Timer который выполняет одну задачу один раз:

после того, как последняя живая ссылка на объект таймера уходит, и все невыполненные задачи завершили выполнение, поток выполнения задачи таймера завершается изящно (и становится предметом мусора коллекция.) Однако это может занять произвольно много времени. По умолчанию поток выполнения задачи не выполняется как поток демона, поэтому он способен удерживать приложение от завершения. Если вызывающий объект хочет быстро завершить поток выполнения задачи таймера, вызывающий объект должен вызвать метод отмены таймера.


вам нужно будет вызвать другой метод планирования таймера, называемый scheduleAtFixedRate(...), который может быть 3 параметра. Первые 2 идентичны используемому расписанию, а третий параметр указывает период времени в миллисекундах между последовательными исполнениями задач.

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

вы можете проверить Java PAI doc для этого метода здесь: http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html#scheduleAtFixedRate(java.util.TimerTask, Ява.утиль.Дата, длинная)


вот пример

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();
  }

}


точнее вот: ChangeSomething () - конструктор класса ChangeSomething. Конструктор будет выполняться немедленно при передаче объекта ChangeSomething instace в таймер, а не через 2 секунды. Это то, что метод run() объекта будет запущен через 2 секунды.

чтобы выполнить этот метод run () повторно все 2 секунды, используйте schedule(TimerTask task, long delay, long period)