我正在开发一个机器人,它会在指定的更改间隔内执行一些操作。应用程序的用户可以选择在 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/