gpt4 book ai didi

java - 每天使用 ScheduledExecutorService 安排任务?

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:32 24 4
gpt4 key购买 nike

我每天凌晨 3 AM 使用 ScheduledExecutorService 运行特定任务。现在我不确定我的以下代码是否会在早上 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 点到凌晨 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() 关闭先前的调度程序来适应这种变化;

关于java - 每天使用 ScheduledExecutorService 安排任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20393836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com