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秒运行一次?