2

我刚开始学习编程(两周前),我正在尝试为游戏制作机器人。在bot的主类中,有3个方法需要在2秒内返回,否则返回null。我想避免返回 null 并返回它在 2sec 期间计算的内容。

public ArrayList<PlaceArmiesMove> getPlaceArmiesMoves(BotState state, Long timeOut){

ArrayList<PlaceArmiesMove> placeArmiesMoves = new ArrayList<PlaceArmiesMove>();

// caculations filling the ArrayList

return placeArmiesMoves;
}

我想要做的是 2 秒后,返回 placeArmiesMoves,方法是否完成运行。我已经阅读了有关番石榴 SimpleTimeLimiter 和 callWithTimeout() 的信息,但我完全不知道如何使用它(我阅读了有关多线程的一些内容,但我只是不明白这是什么)如果有人可以帮助我,我将非常感激!谢谢

4

2 回答 2

1

给定一个类似 的函数getPlaceArmiesMove,您可以使用多种技术来限制其执行时间。

信任函数来跟踪时间本身

如果函数运行一个循环,它可以在每次迭代时检查时间是否已过期。

long startTime = System.currentTimeMillis()
for (;;) {
    // do some work
    long elapsed = System.currentTimeMillis() - startTime;
    if (elapsed >= timeOut) {
        break;
    }
}

这种技术很简单,但不能保证它会在超时之前完成;这取决于功能以及您可以使工作的粒度(当然,如果它太细,您将花费更多时间来测试超时是否已过期而不是实际工作)。

在线程中运行函数,并要求它停止

我不熟悉番石榴,但这似乎是 SimpleTimeLimiter 正在做的事情。在 Java 中,通常不可能强制停止线程,但可以在超时后忽略线程(该函数将运行到完成,但您已经使用了它的部分结果,并忽略了完整的结果来得太晚了)。Guava 说如果它在超时之前没有返回,它会中断线程。这仅在您的函数正在测试以查看它是否已被中断时才有效,就像“信任您的函数”技术一样。

有关如何测试线程是否已被中断的示例,请参阅此答案。请注意,如果线程被中断,某些 Java 方法(如Thread.sleep)可能会抛出。InterruptedException

最后,对isInterrupted()整个函数进行检查与对超时进行手动检查没有太大区别。所以在线程中运行,你仍然必须信任你的函数,但可能有更好的助手可用于这类事情(例如 Guava)。

在单独的进程中运行该函数,然后将其杀死

如何执行此操作的示例留作练习,但如果您在单独的进程(或支持强制停止线程的语言中的线程,例如 Erlang、Ruby 等)中运行您的函数,那么您可以使用操作系统如果进程在超时后没有完成,则终止进程。

让该过程返回部分结果将具有挑战性。它可以通过管道定期向调用进程发送“正在进行的工作”,或者定期将工作保存到文件中。

于 2014-03-31T15:38:42.300 回答
0

使用 Java 的 Timer 包,但这需要您理解线程和方法覆盖等概念。不过,如果这是您需要的,答案与这个问题如何在 java 中设置计时器非常相似

于 2014-03-31T15:16:29.017 回答