使用ScheduledExecutiorService每天安排一项任务



我每天早上使用ScheduledExecutorService3 AM运行特定任务。现在我不确定我下面的代码是否会在每天早上的3 AM调用MyTask()?由于我不确定我的逻辑是否正确,

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Date aDate = ......// Current date or parsed date;
Calendar with = Calendar.getInstance();
with.setTime(aDate);
int hour = with.get(Calendar.HOUR);
int intDelayInHour = hour < 3 ? 3 - hour : 24 - (hour - 3);
scheduler.scheduleAtFixedRate(new MyTask(), intDilayInHour, 24, TimeUnit.HOURS); 

为了测试这一点,我需要等一天,看看它是否有效,我不想这样做。

有人能帮我确定我上面的代码是否正确吗?

您的代码也是正确的,但问题是,在您的情况下,错误窗口是+-59分±59秒,即您的任务可以安排在凌晨3.00到4.00之间运行,但如果您想更准确,请尝试此操作,

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Date aDate = new Date();// Current date or parsed date;
Calendar with = Calendar.getInstance();
with.setTime(aDate);
int hour = with.get(Calendar.HOUR_OF_DAY);
int Minutes = with.get(Calendar.MINUTE);
int MinutesPassed12AM = hour * 60 + Minutes;
int MinutesAt3AM = 3 * 60;
int OneDayMinutes = 24 * 60;
long DelayInMinutes = MinutesPassed12AM <= MinutesAt3AM ? MinutesAt3AM - MinutesPassed12AM : OneDayMinutes - (MinutesPassed12AM - MinutesAt3AM);

scheduler.scheduleAtFixedRate(new MyTask(), DelayInMinutes, OneDayMinutes, TimeUnit.MINUTES); 

编辑如果您查看[夏令时])http://en.wikipedia.org/wiki/Daylight_saving_time)您可以在中看到有多少国家使用了这种夏令时,在夏令时中,时钟被调整为最大+-1小时并且一年中也只有两次,如果你的任务非常健壮,应该适应这种变化,那么你可以通过重新调用上面提到的代码并通过scheduler.shutdown();关闭以前的调度器来适应这种变化。

最新更新