2010-07-07 65 views
3

我工作在Java中的調度系統,該系統發出根據的startDate提醒,結束日期發生(每小時,每天,每週,每月上,星期一等)。我原來是用定時器TimerTask的班安排提醒:ScheduledExecutorService.scheduleAtFixedRate和設置在initialDelay爲過去的日期

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

我最近切換到ScheduledExecutorService的這樣我就可以有取消事件的更多控制。 ScheduledExecutorService對於定期提醒非常有效,除了過去用startDate重新安排提醒的一種情況。該scheduleAtFixedRate功能只允許你爲指定值在initialDelay,而不是實際的日期對象:

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

這就帶來了一個問題,因爲傳遞一個負面在initialDelay還是引起該事件立即因此導致其重新出現在現在 + 期間,而不是startDate + 期間

任何想法我可以(重新)安排提醒與startDate在過去?

回答

2

只需快速檢查一下日期是否過去,然後創建一個新的臨時開始日期時間即現在開始的增量。

+0

感謝您的答覆,看起來像這樣做會伎倆。以下是計算initialDelay的代碼片段: Calendar now = Calendar.getInstance(); 日曆開始= reminder.getStartCalendar(); (start.before(now)){ start.add(Calendar.MILLISECOND,(int)reminder.getPeriod()); } long initialDelay = start.getTimeInMillis() - now.getTimeInMillis(); ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); this.scheduler.scheduleAtFixedRate(提醒,initialDelay,reminder.getPeriod(),TimeUnit.MILLISECONDS); – 2010-07-07 23:26:33

相關問題