【发布时间】:2019-08-18 20:26:01
【问题描述】:
我正在尝试创建一个计划作业,该作业从每天早上 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 点停止任务,然后在第二天早上 7 点重新开始?
或者,有没有更好的方法在每天的特定时间段内运行任务?
【问题讨论】:
-
顺便说一下,
Calendar是一个糟糕的类,几年前随着 JSR 310 的采用被现代 java.time 类所取代。对于 Java 6 和7、查看ThreeTen-Backport项目。
标签: java scheduled-tasks scheduledexecutorservice