ScheduledExecutorService.scheduleAtFixedRate并将initialDelay设置为过去的日期

时间:2010-07-07 16:34:55

标签: java timer futuretask

我正在研究Java中的调度系统,该系统基于 startDate endDate 发生发送提醒(每小时,每天,每周,每月,周一等)。最初我使用 Timer TimerTask 类来安排提醒:

Timer timer = new Timer();
timer.scheduleAtFixedRate(reminder, firstDate, period);

我最近切换到 ScheduledExecutorService ,因此我可以更好地控制取消事件。 ScheduledExecutorService 适用于定期提醒,但过去使用 startDate 重新安排提醒的情况除外。 scheduleAtFixedRate 函数只允许您为 initialDelay 指定 long 值,而不是实际的 Date 对象:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(reminder, initialDelay, period, unit);

这会带来一个问题,因为传入负的 initialDelay 仍会导致事件立即被触发,从而导致它再次出现在现在 + 期间,而不是 startDate + 期间

我是否可以(重新)在过去使用 startDate 安排提醒?

2 个答案:

答案 0 :(得分:2)

只需快速检查日期是否过去,然后创建一个新的临时开始日期时间,即现在开始的增量。

答案 1 :(得分:0)

我通过在启动时运行一次然后在我每天都想要的时间来解决它:

// 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
);