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

これは私が得るものです:

1000.0 で開始する 1 つのタイマー

1000.0 で開始する 1 つのプロセス

2109.0 で 1 つのプロセスが終了

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 は (3000 ではなく) 4109 で開始するべきではありませんか? 「scheduleAtFixedRate」を使用してみましたが、まったく同じ結果が得られました。私は何か間違ったことをしましたか?それとも、私が理解できない概念がありますか?

4

1 に答える 1

4

いいえ、それが意図された動作です。期間は、終了時刻と次の開始時刻の間の期間ではなく、開始時刻の間の期間です。

基本的には、平易な英語で「1秒から開始し、その後2秒ごとに実行する」と言っているので、1、3、5、7などが論理的な解釈です。

于 2013-02-28T06:34:05.380 に答える