我正在研究一种机器人,它可以按指定的更换间隔执行某些操作。应用程序的用户可以选择在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()
来保留任务,这是不需要的 - 我只想保留“最新鲜”的任务并丢弃旧的任务。
什么是我的问题的最佳解决方案?
我想在不使用框架的情况下尽可能简化解决方案。
答案 0 :(得分:2)
要回答您的标题:使用submit
,而不是schedule
或任何相关功能。特别要查看ExecutorService
接口而不是ScheduledExecutorService
,因为它的方法不会包含任何重复的内容。
要回答这个问题,我认为这是你的实际问题:
我只想保留“最新鲜”的任务并丢弃旧的任务。
请注意,在安排任务时,会返回ScheduledFuture<?>
。您可以在提交较新任务时取消该操作。