SingleThreadScheduledExecutor 运行 计划

SingleThreadScheduledExecutor running schedule

我有一个包含 singleThreadScheduledExecutor 的 运行 方法。目标是在早上 6 点到晚上 8 点之间每 30 分钟运行。如果那天是周末或在这些时间之外,运行time 程序应该在日志中添加一条消息并等待 30 分钟后再试。

然而,当服务器启动我的程序并且它在正确的时间范围内时,(在这种情况下,假设它在早上 7 点第一次尝试 运行 程序)当它经过指定时间它仍然会 运行(在这种情况下,它会在晚上 830 点再次尝试,但仍然会 运行)。通过它进行调试会通过 if 语句并简单地忽略大小写。我还发现,如果我 运行 我的程序在正确的时间之外,它会在日志中添加一条错误消息,但当它回到正确的时间范围内时,它将继续只记录错误而不是 运行ning 程序。

因此我的问题是:在我根本没有看到的逻辑中是否遗漏了什么?有没有 better/more 有效的方法来做到这一点?

提前致谢。

下面附上代码

public final void run() {
    final Calendar cal = Calendar.getInstance();
    exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(new Runnable() {
        public void run() {
            try {

                if (cal.get(Calendar.DAY_OF_WEEK) == 1 || cal.get(Calendar.DAY_OF_WEEK) == 7) {
                    Globals.addMessage("Non-scheduled work day, please try again later.");
                    Globals.addMessage("Process aborted.");
                    running = false;

                }
                else if (cal.get(Calendar.HOUR_OF_DAY) < 6 || cal.get(Calendar.HOUR_OF_DAY) > 20) {
                    Globals.addMessage("Non-scheduled work hours, please try again later.");
                    Globals.addMessage("Process aborted.");
                    running = false;

                }
                else {
                    running = true;
                    Runtime rt = Runtime.getRuntime();
                    rt.exec(ServerVar.getVariable(ServerVars.PATH));
                    Globals.addMessage("Program is running.");
                }
            }
            catch (IOException e) {
                Globals.addMessage(e.toString());

            }

        }
    }

        , 0, 30, TimeUnit.MINUTES);
}

您一直在使用相同的 Calendar。试试这个:

public final void run() {
    exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(new Runnable() {
        public void run() {
            final Calendar cal = Calendar.getInstance();
            try {

                if (cal.get(Calendar.DAY_OF_WEEK) == 1 || cal.get(Calendar.DAY_OF_WEEK) == 7) {
                    Globals.addMessage("Non-scheduled work day, please try again later.");
                    Globals.addMessage("Process aborted.");
                    running = false;

                }
                else if (cal.get(Calendar.HOUR_OF_DAY) < 6 || cal.get(Calendar.HOUR_OF_DAY) > 20) {
                    Globals.addMessage("Non-scheduled work hours, please try again later.");
                    Globals.addMessage("Process aborted.");
                    running = false;

                }
                else {
                    running = true;
                    Runtime rt = Runtime.getRuntime();
                    rt.exec(ServerVar.getVariable(ServerVars.PATH));
                    Globals.addMessage("Program is running.");
                }
            }
            catch (IOException e) {
                Globals.addMessage(e.toString());

            }

        }
    }

        , 0, 30, TimeUnit.MINUTES);
}