![](/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.