检查自上次检查以来是否有匹配单位的时间

时间:2013-05-23 05:08:41

标签: java time triggers alarm

我有一个需要以特定间隔触发的系统

如果给出以下内容:

minutes:25, seconds:10

然后它应该在每小时,25分钟和10秒后触发。例如,7:25:10,8:25:10,9:25:10,等等。

这很简单,我已经有了代码。问题是它只有在系统每秒至少检查一次时才有效,否则会错过触发器。

那么如何检查触发单元是否与上次检查后的当前时间单位相匹配?检查之间的时间差异很大。

触发单位的存储方式如下:

// units that must match the current time <Calendar Unit, Trigger>
private Map<Integer, Integer> triggerUnits;

3 个答案:

答案 0 :(得分:2)

首先移动到enum而不是map。枚举可以包含小时,秒,日等等。好的新东西是这样的枚举已经存在于JDK中并被称为TimeUnit。此枚举的每个成员都知道将时间转换为其他单位。

因此,解析字符串hour:5。将5小时翻译为3600 * 5 * 1000毫秒。该值将在您的系统中使用。你有几种可能性,但我建议你从java.util.Timer开始。每个任务都可以在计时器中安排。它使用一个单独的线程来执行所有任务。

如果需要,可以使用Executors框架:

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.schedule(...);

此处的schedule方法直接适用于时间单位。您甚至不必从一个单元转换到另一个单元。

答案 1 :(得分:1)

每次触发系统时,请在下次需要触发代码时存储。在检查期间,只需检查当前时间是否已经过“下一次”,如果是,则触发系统。

答案 2 :(得分:1)

不完全是你问过的问题的答案,但我建议使用cron4jPredictor听起来几乎就是你所需要的。将您的规范转换为cron格式,然后将其传递给Predictor,它实际上会告诉您下次执行的绝对时间。您可以安排在那个时刻进行检查,或者使用ScheduledExecutor来解雇工作。

在某些方面可能会有点复杂(以及它的附加依赖性),但完全消除了时间风险。