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