Как заставить что-то происходить через определенные промежутки времени в Java-программе? - PullRequest
1 голос
/ 01 августа 2011

По сути, у меня есть значение int, x, которое является переменной экземпляра класса. Первоначально он установлен в 0. У меня есть другой метод, getNum, который увеличивает и возвращает х. Этот метод getNum () вызывается внешней программой. Однако каждый день (скажем, в полночь, для простоты) я хочу сбросить x на 0. Как бы это сделать? Проблемы, с которыми я сталкиваюсь сейчас: Date (int, int, int) устарела, но метод принимает только даты, а не календари; событие TimerTask никогда не происходит; каждый раз, когда я запускаю программу внизу, она просто печатает «0» каждый раз, даже если число не должно постоянно сбрасываться. В принципе ничего не работает. Есть идеи, что не так?

import java.util.*;
class Foo {
  private static void scheduleTimer() {
  Timer timer = new Timer();
  long c = 86400000;
  timer.scheduleAtFixedRate(new MyTimerTask(),
  new Date(2011, 7, 31), c);
  }
  public static int getNum() { return x++; }
  private static int x = 0;
  public static void resetNum() { x = 0; }
}

class MyTimerTask() extends TimerTask {
  public void run() {  
    Foo.resetNum(); 
  }

public class Bar { // in a separate file
public static void main (String[] args) {
   System.out.println(Foo.getNum());
  }
}

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Исправьте две ошибки компиляции, вызовите Foo.scheduleTimer () где-нибудь, чтобы фактически запустить таймер, назначьте таймеру разумную задержку и период (например, несколько секунд), а затем повторно вызывайте Foo.getNum () вместо одного раза,Например:

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

public class Foo {
    public static void scheduleTimer() {
        Timer timer = new Timer();
        long c = 3000;
        timer.scheduleAtFixedRate(new MyTimerTask(), c, c);
    }

    public static int getNum() { return x++; }
    private static int x = 0;
    public static void resetNum() { x = 0; }
}

class MyTimerTask extends TimerTask {
    public void run() {
        Foo.resetNum();
    }
}

class Bar {
    public static void main(String[] args) throws Exception {
        Foo.scheduleTimer();
        while (true) {
            System.out.println(Foo.getNum());
            Thread.sleep(1000);
        }
    }
}
0 голосов
/ 01 августа 2011

Согласно документации для scheduleAtFixedRate(TimerTask, Date, long):

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

Так что для вызова вашей задачи потребуется примерно 86400000 миллисекунд. Вы действительно так долго ждете, чтобы подтвердить, что он не работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...