我有一个需要以特定间隔触发的系统
如果给出以下内容:
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;
答案 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)