【问题标题】:How to make something happen at fixed intervals of time in a java program?如何在java程序中以固定的时间间隔发生一些事情?
【发布时间】:2011-10-17 03:35:48
【问题描述】:

基本上,我有一个 int 值 x,它是一个类的实例变量。它最初设置为 0。我有另一种方法“getNum”,它递增并返回 x。此 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());
  }
}

【问题讨论】:

  • 我假设在某处发生了对 scheduleTimer 的实际调用?
  • 从这个 sn-p 中也很难判断到底发生了什么。如果您的 java 应用程序退出,我的理解是该变量值不会持续存在。如果你期望它,当 main() 只调用它然后退出时,你的设计有问题。

标签: java methods time timer instance


【解决方案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);
        }
    }
}

【讨论】:

    【解决方案2】:

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

    调度指定任务以重复固定速率执行, 从指定时间开始。随后的处决发生在 大约是固定的时间间隔,由指定的时间段分隔。

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

    【讨论】:

    • 不,我尝试了 3000 毫秒/3 秒到 30 秒,但没有成功。 864000000,有一天,一旦我确认它有效,它最终会是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2017-09-06
    相关资源
    最近更新 更多