我正在尝试创建一个计划的作业,该作业每天从上午7点到下午22点每5分钟运行一次。例如,它应在7:00、7:05、7:10 ... 21:55,蚂蚁运行,然后应在22:00停止。接下来,它再次运行相同的时间表,依此类推。
我发现了这个示例,该示例显示了如何使用ScheduledExecutorService
在特定时间启动任务。
How to run certain task every day at a particular time using ScheduledExecutorService?
我参考了答案,并编写如下代码: (我正在使用Java 7)
class Scheduler {
private ScheduledExecutorService executors;
public static void main(String[] arg) {
Runnable task = new Runnable() {
@Override
public void run() {
...DO SOMETHING...
}
};
// Get how many seconds before the next start time (7AM).
long initDelay = getInitialDelay(7);
ScheduledExecutorService executors = Executors.newSingleThreadScheduledExecutor();
executors.scheduleAtFixedRate(task, initDelay, (60 * 5), TimeUnit.SECONDS);
}
private static long getInitialDelay(int hour) {
Calendar calNow = Calendar.getInstance();
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
long diff = cal.getTimeInMillis() - calNow.getTimeInMillis();
if (diff < 0) {
cal.add(Calendar.DAY_OF_MONTH, 1);
diff = cal.getTimeInMillis() - calNow.getTimeInMillis();
}
return diff / 1000;
}
}
我的上述代码从上午7点开始,每5分钟运行一次。但是,如何控制ScheduledExecuterService
在22 PM停止任务,然后在第二天7 AM重新开始?
或者,在每天的特定时间段内,还有其他更好的方法来运行任务吗?
答案 0 :(得分:0)
固定的预定执行程序服务无法更改其时间。
因此,请使用单次运行的非固定计划执行程序服务。致电ScheduledExecutorService::schedule
。第一次运行时,请检查当前时间。如果在工作日结束之前,请再次调用相同的方法schedule
,并延迟五分钟。如果在工作日结束之后,经过8个小时的延迟,则该时间是新工作日开始之前的时间。
所以,这是一个简单的小技巧。可运行的每次运行都会无休止地计划下一次运行。