ExecutorService仅安排单个任务

时间:2014-04-21 19:45:12

标签: java executorservice

我正在研究一种机器人,它可以按指定的更换间隔执行某些操作。应用程序的用户可以选择在GUI中随时随地执行这些操作。无论如何调用,主函数然后计算剩余时间,直到下一个东西应该完成并将其传递给调度程序。此外,应用程序应该能够运行很长时间。

public final class Bot {
    private ScheduledFuture<?> mainHandle;
    private final Runnable runMainFunction;
    private boolean lock;
    private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

    public Bot () {
        runMainFunction = new Runnable() {
            @Override
            public void run() {
                if (!lock) {
                    lock = true;
                    mainFunction();
                } else {
                    //already running
                }
            }
        };
        lock = false;
        mainHandle = scheduler.schedule(runMainFunction, 0, SECONDS);
    }

    private void mainFunction() {
        doStuff();
        mainHandle = scheduler.schedule(runMainFunction, calcNewTime(), SECONDS);
        lock = false;
    }

    public void manualCall() {
        if (!lock) {
            mainHandle = scheduler.schedule(runMainFunction, 0, SECONDS);
        }
    }

(在写这篇文章的时候,我的印象是mainHandle只会存储最新的任务 - 但这是我第一次安排......而且我很困惑。)

代码有效,但每次调用mainFunction()时,都会在之前的任务之上创建新任务(通常具有相同的延迟时间)。这导致应用程序使用来自用户的每个manualCall()来保留任务,这是不需要的 - 我只想保留“最新鲜”的任务并丢弃旧的任务。

什么是我的问题的最佳解决方案?

我想在不使用框架的情况下尽可能简化解决方案。

1 个答案:

答案 0 :(得分:2)

要回答您的标题:使用submit,而不是schedule或任何相关功能。特别要查看ExecutorService接口而不是ScheduledExecutorService,因为它的方法不会包含任何重复的内容。

要回答这个问题,我认为这是你的实际问题:

  

我只想保留“最新鲜”的任务并丢弃旧的任务。

请注意,在安排任务时,会返回ScheduledFuture<?>。您可以在提交较新任务时取消该操作。