如何在java程序中以固定的时间间隔进行某些操作?

时间:2011-08-01 02:32:25

标签: java methods time timer instance

基本上,我有一个int值x,它是一个类的实例变量。它最初设置为0。我有另一种方法,“getNum”,增加并返回x。这个getNum()方法由外部程序调用。然而,每天(比如说,在午夜,为了简单起见)我想将x重置为0.如何做到这一点?我现在遇到的问题:不推荐使用Date(int,int,int),但该方法只需要Dates,而不是Calendars; 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 个答案:

答案 0 :(得分:1)

修复你的两个编译错误,调用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);
        }
    }
}

答案 1 :(得分:0)

根据scheduleAtFixedRate(TimerTask, Date, long)的文档:

  

为重复的固定费率执行安排指定的任务,   从指定时间开始。随后的处决发生在   大约定期的间隔,以指定的时间间隔分开。

因此,调用任务大约需要86400000毫秒。你真的在等那么久才确认它不起作用吗?