【问题标题】:java.util.Timer SystemTime effect?java.util.Timer SystemTime 效果?
【发布时间】:2011-08-20 07:35:05
【问题描述】:

现在说是 6 点,我有一个 Timer 并安排了一个 TimerTask 在 10 点。之后,系统日期时间由其他服务(例如 ntp)调整为 9 点。我仍然希望我的TimerTask 将在 10 点被解雇,但它不会,Timer 仍然等待接下来的 4 小时并解雇我的TimerTask。在这种情况下我该怎么办?

【问题讨论】:

    标签: java timer timertask


    【解决方案1】:

    首先,如果你的时钟已经过了 4 小时,你已经陷入了非常糟糕的混乱之中。通常时间调整只会以毫秒或秒为单位 - 或者偶尔一两分钟,如果机器很长时间没有在线的话。一种选择是在设置计时器之前通过自己的 NTP 调用来检查时间是否相当准确。

    另一种选择是创建一个合理定期调用的计时器 - 例如每分钟或每五分钟一次 - 它会检查时间然后选择性地采取行动。它的效率略低,但我不认为唤醒单个线程以每分钟执行一次简单检查的影响会对性能产生重大影响。您应该根据您需要计时器触发的准确程度以及您需要它对性能的影响有多大来调整检查的规律性。

    【讨论】:

    • 这个数字只是一个例子。我想到的是当 SystemTime 改变时 Timer 的行为。
    • @secmask:那为什么要举一个不太可能的例子呢?您还应该告诉我们,您的任务在接近预期的时间执行有多重要——您有多大的误差范围等。
    • 我有一个 TimerTask 需要一次触发(物理时间,例如 new Date()+ x_hours 的结果),但是当有人更改系统时间时,我的 TimerTask 当时不会触发点,但迟早。而且我认为这让我(和一些人)感到困惑。
    • @secmask:这并不能回答错误的余量是多少。每分钟检查一次就够了吗?显然,如果有人将系统时间从下午 1 点更改为下午 5 点,而您本来打算在下午 3 点开火,那么您显然 不会 能够在下午 3 点开火,因为它基本上不存在。在这种情况下你会想要做什么?
    • 是的,使用循环和检查是可以的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    相关资源
    最近更新 更多