使用ScheduledExecutorService每天安排任务?

时间:2013-12-05 07:21:09

标签: java calendar background-thread scheduledexecutorservice

我每天早上在ScheduledExecutorService使用3 AM来执行特定任务。现在我不确定我的下面的代码是否会在每天早上MyTask()拨打3 AM?因为我不确定我的逻辑是否正确

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

为了测试这一点,我需要等待一天,看看它是否正在运行,我不想这样做。

有人可以帮我确定我的上述代码是否正确吗?

1 个答案:

答案 0 :(得分:3)

您的代码也是正确的,但问题是您的错误窗口是+ -59分钟和+ -59秒,即您的任务可以安排在凌晨3点到凌晨4点之间运行但是如果您想要更准确试试这个,

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();关闭以前的调度程序。