java - ExecutorService 仅调度单个任务

标签 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() 中囤积任务,这是不需要的 - 我只想保留“最新”任务并丢弃较旧的任务。

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

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

最佳答案

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

要回答这个问题,我认为这是您真正的问题:

I only want to keep the "freshest" task and discard the older ones.

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

关于java - ExecutorService 仅调度单个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204728/

相关文章:

java - java 中每秒生成 X 个线程

java - 如何从方法中声明私有(private)静态最终int(java初学者)

Java的ExecutorService性能

java - 对 Future.get() block 的方法调用。这真的很可取吗?

java - 捕获当前线程的执行者

java - 从接口(interface)实现方法而不覆盖

Java 和 XML : hack to avoid back-compatibility

java - Spring "magically"如何知道要使用哪种 Bean 类型?

java - ExecutorService.shutDown() 和 ExecutorService.shutDownNow() 之间的中间地带

java - "Runnable::run"- 这是如何创建 Executor 实例的?