繁体   English   中英

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

[英]How to run a task DURING PARTICULAR PERIOD OF TIME with ScheduledExecutorService?

我正在尝试创建一个计划作业,每天从早上 7 点到下午 22 点每 5 分钟运行一次。 例如,它应该在 7:00、7:05、7:10 ... 21:55 运行,然后它应该在 22:00 停止。 第二天,它再次运行相同的计划,依此类推。

我发现这个例子展示了如何使用ScheduledExecutorService在特定时间启动任务。 如何使用 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 点重新开始?

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

固定的预定执行程序服务不能改变其时间。

所以使用单次运行的非固定预定执行器服务。 调用ScheduledExecutorService::schedule 在第一次运行时,检查当前时间。 如果在工作日结束之前,再次调用相同的方法schedule ,传递五分钟的延迟。 如果在工作日结束后延迟八小时,即新工作日开始前的时间量。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM