![](/img/trans.png)
[英]ScheduledExecutorService.scheduleAtFixedRate - reentrant?
[英]ScheduledExecutorService.scheduleAtFixedRate And Setting initialDelay To Date In The Past
我正在使用Java的调度系统,该系统基于startDate , endDate和事件 (每小时,每天,每周,每月,星期一等)发送提醒。 最初,我使用Timer和TimerTask类来安排提醒:
Timer timer = new Timer();
timer.scheduleAtFixedRate(reminder, firstDate, period);
我最近切换到ScheduledExecutorService,因此可以对取消事件进行更多控制。 ScheduledExecutorService可以很好地用于重复提醒,但过去的一种情况是使用startDate重新安排提醒。 scheduleAtFixedRate函数仅允许您为initialDelay指定长值,而不是实际的Date对象:
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(reminder, initialDelay, period, unit);
这带来了一个问题,因为传入负的initialDelay仍然会导致事件立即被触发,从而导致事件在now + period而不是startDate + period再次发生。
有什么想法可以怎样用startDate来(重新)安排提醒吗?
只需快速检查一下日期是否是过去的日期,然后创建一个新的临时开始日期时间即可,即现在开始的时间增量。
我通过在启动时运行一次然后在每天都想运行的时候解决了它:
// check once initial on startup
doSomething();
// and then once every day at midnight utc
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
LocalDateTime firstRun = LocalDate.now(ZoneOffset.UTC).atStartOfDay().plusDays(1);
Duration durationUntilStart = Duration.between(LocalDateTime.now(ZoneOffset.UTC), firstRun);
scheduler.scheduleAtFixedRate(
() -> doSomething(),
durationUntilStart.getSeconds() + 1,
Duration.ofDays(1).getSeconds(),
TimeUnit.SECONDS
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.