gpt4 book ai didi

java - 什么是java.util.Timer固定延迟周期任务?

转载 作者:行者123 更新时间:2023-12-02 03:10:42 25 4
gpt4 key购买 nike

这是我正在尝试的代码:

import java.util.Timer;
import java.util.TimerTask;

public class PeriodicTask {

public static void main (String[] args) {

System.out.println("Main thread: " + Thread.currentThread());
Timer timer = new Timer();
final long start = System.currentTimeMillis();
timer.schedule(new TimerTask() {
@Override
public void run () {
System.out.print("Timer task invoked in millis: " +
(System.currentTimeMillis()- start));
System.out.println(" -- " + Thread.currentThread());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task finished "+(System.currentTimeMillis()
- start));
}
}, 1000,500);
}
}

输出:

Main thread: Thread[main,5,main]
Timer task invoked in millis: 1000 -- Thread[Timer-0,5,main]
task finished 2001
Timer task invoked in millis: 2001 -- Thread[Timer-0,5,main]
task finished 3002
Timer task invoked in millis: 3002 -- Thread[Timer-0,5,main]
task finished 4002
Timer task invoked in millis: 4002 -- Thread[Timer-0,5,main]
......

根据 java.util.Timer 文档,提供的时间段应分隔每个任务的执行。所以我期望每个捕获的任务和新调用的任务应该相隔 500 毫秒,例如第一个任务执行结束和第二个任务执行开始之间应该是:

task finished 2001
Timer task invoked in millis: **2501** -- Thread[Timer-0,5,main]

我错过了什么吗?

我使用的是 JDK 1.8

最佳答案

分隔每个任务的句点不是相对于任务的结束而是相对于任务的开始。 Timer 将在 period 过后尝试再次安排任务。除非任务仍在运行,否则将在前一个任务完成后立即调度。

在您提供的示例中,您设置了 Timerperiod500ms。您在 run() 方法内调用了 sleep(),持续 1000ms。这意味着 Timer 想要在半秒后再次安排该任务,但无法实现,因为上一个任务还有半秒才能完成。

关于java - 什么是java.util.Timer固定延迟周期任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38907725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com