Java 执行器服务计划仅限单个任务

Java 执行器服务计划仅限单个任务,java,executorservice,Java,Executorservice,我在一个机器人上工作,它在指定的改变时间间隔内做一些事情。应用程序的用户可以选择在GUI中随时执行这些操作。不管调用了什么,main函数都会计算在下一步工作完成之前的剩余时间,并将其传递给调度器。此外,应用程序应该能够运行很长时间 public final class Bot { private ScheduledFuture<?> mainHandle; private final Runnable runMainFunction; private bool

我在一个机器人上工作,它在指定的改变时间间隔内做一些事情。应用程序的用户可以选择在GUI中随时执行这些操作。不管调用了什么,main函数都会计算在下一步工作完成之前的剩余时间,并将其传递给调度器。此外,应用程序应该能够运行很长时间

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);
        }
    }
公共最终类Bot{
私有调度未来主句柄;
私有最终可运行runmain函数;
私有布尔锁;
private final ScheduledExecutorService scheduler=Executors.newSingleThreadScheduledExecutor();
公共Bot(){
runMainFunction=new Runnable(){
@凌驾
公开募捐{
如果(!锁定){
lock=true;
main函数();
}否则{
//已经在运行
}
}
};
锁=假;
mainHandle=scheduler.schedule(runmain函数,0,秒);
}
私有函数(){
doStuff();
mainHandle=scheduler.schedule(runmain函数,calcNewTime(),秒);
锁=假;
}
公共电话{
如果(!锁定){
mainHandle=scheduler.schedule(runmain函数,0,秒);
}
}
(写这篇文章时,我的印象是,
mainHandle
只会存储计划的最新任务-但这是我第一次进行计划……我感到困惑。)

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

解决我的问题最好的办法是什么


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

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

为了回答这个问题,我认为这是你真正的问题:

我只想保留“最新”的任务,放弃旧的任务


请注意,当您计划任务时,将返回一个
ScheduledFuture
。您可以在提交新任务时取消该任务。

调用
mainHandle.cancel(true)
,然后在
manualCall()中计划下一个任务
已经解决了我的问题。非常感谢。@Deutherius您可能想要
false
。不需要发送中断来让您的调用完成一半,因此,buggy。我希望不会发生这种情况,因为
锁定机制。但是如果是这样,那么让函数完成会导致多个任务再次累积,w不是吗?