如何使用ScheduledExecutorService在特定时间段内运行任务?

时间:2019-03-28 06:22:28

标签: java scheduled-tasks scheduledexecutorservice

我正在尝试创建一个计划的作业,该作业每天从上午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重新开始?

或者,在每天的特定时间段内,还有其他更好的方法来运行任务吗?

1 个答案:

答案 0 :(得分:0)

固定的预定执行程序服务无法更改其时间。

因此,请使用单次运行的非固定计划执行程序服务。致电ScheduledExecutorService::schedule。第一次运行时,请检查当前时间。如果在工作日结束之前,请再次调用相同的方法schedule,并延迟五分钟。如果在工作日结束之后,经过8个小时的延迟,则该时间是新工作日开始之前的时间。

所以,这是一个简单的小技巧。可运行的每次运行都会无休止地计划下一次运行。