在下面的示例中,重复任务如何完全“错过”四个调用?

时间:2016-10-26 15:27:51

标签: java timertask

JCIP摘要 -

  

如果计划重复的TimerTask每隔10毫秒运行一次,那么另一个   Timer-Task需要40毫秒才能运行,重复任务要么(取决于   被调用是以固定速率还是固定延迟调度   在长期任务完成后,快速连续四次,   或完全“错过”四次调用。

据我所知,由于第一项任务计划在每10ms后运行一次,因此在40 ms内,它将被执行4次。

但作者的意思是什么完全错过了四次调用?

2 个答案:

答案 0 :(得分:2)

以下是代码中的示例:

public static void main(String[] args) throws Exception {
    final long start = System.currentTimeMillis();
    Timer timer = new Timer();

    // Schedule a new task that runs at a 10ms interval and stars immediately
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("10ms delayed task ran at " + (System.currentTimeMillis() - start));
        }
    }, 0, 10);

    // Schedule a task to start in 50ms that takes 40ms to run.
    // It cancels itself so it's only run once.
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("slow task ran at " + (System.currentTimeMillis() - start));
            try {
                Thread.sleep(40);
            } catch (InterruptedException e) {

            }
            this.cancel();
        }
    }, 50, 10);

    // Wait 100 ms for the demo to end, then stop the timer.
    Thread.sleep(100);
    timer.cancel();
}

输出:

10ms delayed task ran at 1
10ms delayed task ran at 11
10ms delayed task ran at 22
10ms delayed task ran at 32
10ms delayed task ran at 42
slow task ran at 52
10ms delayed task ran at 92

答案 1 :(得分:1)

所以,有两个任务。任务1计划每10ms运行一次,任务2运行40ms运行。

让我们在时间0说,任务2开始运行,然后立即触发任务1:

0.0:任务2正在运行

0.1:任务1已触发,任务2仍在运行。

10.1:任务1已触发,任务2仍在运行

20.1触发任务1,任务2仍在运行

30.1触发任务1,任务2仍在运行

40.0:任务2完成,任务1开始运行。

正如您所看到的,从任务2开始到任务2结束时,任务1被触发4次而没有机会运行。 此外,任务1将快速连续运行4次,因为它被触发4次但没有机会运行。