2

我试图查看计时器的固定延迟方法(时间表)如何工作,但看起来我失败了。

这是我的代码:

public class Timer_Test {    
  static Timer _a_timer;
  static int num_o_proc = 0;
  static int timer_call = 0;
  static double prog_begin_time;

public static void main(String[] args) {
    prog_begin_time = System.currentTimeMillis();

    _a_timer = new Timer();

    _a_timer.schedule(new TimerTask() {
        @Override
        public void run() {
            timer_call++;
            System.out.println(timer_call + " timer start   at " + (System.currentTimeMillis() - prog_begin_time));
            process();


            System.out.println(timer_call + " timer end   at " + (System.currentTimeMillis() - prog_begin_time));
            if (timer_call >= 5) {
                System.exit(0);
            }
        }
    }, 1000, 2000);
}

public static void process() {
    num_o_proc++;
    int local_num_o_proc = num_o_proc;
    System.out.println(local_num_o_proc + " process start   at " + (System.currentTimeMillis() - prog_begin_time));

    double _a_ = 0;
    for(int x=0; x<Integer.MAX_VALUE/2; x++) {
        _a_++;
    }
    System.out.println(local_num_o_proc + " process end   at " + (System.currentTimeMillis() - prog_begin_time));
  }
}

这就是我得到的:

1 个计时器从 1000.0 开始

1 个进程从 1000.0 开始

1 个进程在 2109.0 结束

1 个计时器在 2109.0 结束

2 计时器从 3000.0 开始

2 进程从 3000.0 开始

2 进程结束于 4109.0

2 定时器在 4109.0 结束

3 计时器从 5000.0 开始

3 进程从 5000.0 开始

3 进程结束于 6109.0 .....

自从第一个计时器任务在 2109 (2109 + 2000) 结束后,计时器 2 不应该从 4109(而不是 3000)开始吗?我尝试使用'scheduleAtFixedRate',它给了我完全相同的结果。我做错什么了吗?还是有一些我无法理解的概念?

4

1 回答 1

4

不,这就是它的工作方式。时间段是开始时间之间的时间段,而不是结束时间和下一次开始时间之间的时间段。

基本上你用简单的英语告诉它“从 1 秒开始,然后每两秒执行一次”,所以 1、3、5、7 等是合乎逻辑的解释。

于 2013-02-28T06:34:05.380 回答