如何理解Java计时器“ scheduleAtFixedRate”方法和“ schedule”方法实际运行时间的“赶上”?

时间:2018-11-20 07:45:18

标签: java

java.util.Timer#scheduleAtFixedRate(java.util.TimerTask, long, long)医生说:

  

如果执行由于任何原因(例如垃圾回收或其他后台活动)而延迟,则将快速连续发生两个或更多个执行以“追赶”。

我进行测试,代码如下:

public static void main(String[] args) {
    Timer timer = new Timer();
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            System.out.println(String.format("Task   实际运行时间:%s,需要运行时间:%s", new Date(), new Date(this.scheduledExecutionTime())));
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

    TimerTask timerTask1 = new TimerTask() {
        @Override
        public void run() {
            System.out.println(String.format("Task 1 实际运行时间:%s,需要运行时间:%s", new Date().getTime(), new Date(this.scheduledExecutionTime())));
        }
    };
    System.out.println("开始执行时间:" + new Date());
    timer.schedule(timerTask, 0, 1000);//
    timer.scheduleAtFixedRate(timerTask1, 0, 1000);
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

结果示例:

开始执行时间:Tue Nov 20 15:56:50 CST 2018 --line 1
Task   实际运行时间:Tue Nov 20 15:56:50 CST 2018,需要运行时间:Tue Nov 20 15:56:50 CST 2018 --line 2
Task 1 实际运行时间:1542700613673,需要运行时间:Tue Nov 20 15:56:50 CST 2018,计时器:1 --line 3
Task 1 实际运行时间:1542700613673,需要运行时间:Tue Nov 20 15:56:51 CST 2018,计时器:2 --line 4
Task   实际运行时间:Tue Nov 20 15:56:53 CST 2018,需要运行时间:Tue Nov 20 15:56:53 CST 2018 --line 5

第3,4行实际运行时间是同一时间,以及如何理解方法doc上的catch up

第2,5行Task的运行时间少于3秒,而period为1秒,为什么控制台不是每1秒运行一次?

0 个答案:

没有答案