java - 再延迟 java.util.Timer x 秒

标签 java timer thread-sleep

我正在尝试每三秒运行一次 java.util.Timer,并且我需要在特定条件下将它再延迟 2 秒。为了检查这是否可以使用 Thread.sleep() 实现,我编写了以下代码。

Timer t = new Timer();

t.schedule(new TimerTask() {
    @Override
    public void run() {
        if (true) { //When this is false timer should continue at 3 second interval.
            try {
                Thread.currentThread().sleep(2000); //Delay by another 2 seconds.
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        System.out.println(new Date());
    }
}, 0, 3000); //Trigger every 3 seconds.

我希望打印出相差 5 秒的时间戳。但我得到它的时间相差 3 秒。

Tue Sep 18 15:08:17 IST 2018
Tue Sep 18 15:08:20 IST 2018
Tue Sep 18 15:08:23 IST 2018
Tue Sep 18 15:08:26 IST 2018
Tue Sep 18 15:08:29 IST 2018

我错过了什么?

最佳答案

您的 2 秒 sleep 只是在 TimerTask 触发器之间的 3 秒间隔内模拟 2 秒的工作。因此,在您休眠后大约 1 秒,您的计时器将再次启动。

尝试改为 sleep 5 秒。

但是,请记住,以这种方式延迟并不是很稳定。计时器将考虑所有落后于计划的任务,并在前一个任务完成后立即按顺序触发它们。如果您真的想这样做,最好取消任务并将它们重新安排为 5 秒间隔。

关于java - 再延迟 java.util.Timer x 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52383965/

相关文章:

java - 使用 Java 将 Flex 与 Blazeds 集成的问题

java - android webView 中的 ScrollView 不显示键盘

swift - 快速创建秒表

JavaScript 函数返回用户 session 的负数秒数?

java - 在没有线程的情况下停止程序

java - 替代 JAVA WAR/ZIP/JAR 阅读器/操纵器库

java - 如何将 ZipPath 转换为文件?

events - 如果任务未完成,jBPM 6.2.0 在 1 天时间间隔后发送重复任务提醒

azure - Azure 辅助角色中重复事件的正确代码模式,每个事件之间有相当大的延迟

c# - 在不暂停 UI 的情况下 sleep 运行