我刚刚开始学习编程(两周前),我正在尝试为游戏制作一个机器人。在机器人的主类中,有3个方法需要在2秒内返回,否则将返回null。我想避免返回 null 并返回它在 2 秒内计算出的内容。
public ArrayList<PlaceArmiesMove> getPlaceArmiesMoves(BotState state, Long timeOut){
ArrayList<PlaceArmiesMove> placeArmiesMoves = new ArrayList<PlaceArmiesMove>();
// caculations filling the ArrayList
return placeArmiesMoves;
}
我想要做的是2秒后,返回placeArmiesMoves,无论该方法是否完成运行。我读过有关 guava SimpleTimeLimiter 和 callWithTimeout() 的内容,但我完全不知道如何使用它(我读过一些有关多线程的内容,但我只是不明白这是什么) 如果有人能帮助我,我将非常感激!谢谢
最佳答案
对于像 getPlaceArmiesMove
这样的函数,您可以使用多种技术来限制其执行时间。
相信函数本身可以跟踪时间
如果函数运行循环,它可以在每次迭代时检查时间是否已过期。
long startTime = System.currentTimeMillis()
for (;;) {
// do some work
long elapsed = System.currentTimeMillis() - startTime;
if (elapsed >= timeOut) {
break;
}
}
这种技术很简单,但不能保证它会在超时之前完成;这取决于功能以及您可以使工作变得更加精细(当然,如果太精细,您将花费更多的时间来测试超时是否已过期,而不是实际工作)。
在线程中运行该函数,并要求其停止
我对 Guava 不熟悉,但这似乎就是 SimpleTimeLimiter 正在做的事情。在Java中,通常不可能强行停止线程,尽管可以在超时后忽略该线程(该函数将运行至完成,但您已经使用了它的部分结果,并忽略了来得太晚的完整结果)。 Guava 表示,如果线程在超时之前没有返回,它就会中断线程。仅当您的函数正在测试它是否已被中断时,这才有效,就像“信任您的函数”技术一样。
参见this answer有关如何测试线程是否被中断的示例。请注意,如果线程被中断,某些 Java 方法(例如 Thread.sleep)可能会抛出 InterruptedException。
最后,在整个函数中对 isInterrupted()
进行少量检查与对超时进行手动检查不会有太大不同。因此,在线程中运行,您仍然必须信任您的函数,但可能有更好的助手可用于此类事情(例如 Guava)。
在单独的进程中运行该函数,然后终止它
如何执行此操作的示例留作练习,但如果您在单独的进程(或支持强制停止线程的语言中的线程,例如 Erlang、Ruby 等)中运行函数,那么您可以使用操作系统工具来终止该进程(如果该进程在超时后未完成)。
让该过程返回部分结果将具有挑战性。它可以定期通过管道向调用进程发送“正在进行的工作”,或者定期将工作保存到文件中。
关于java - 当时间限制结束时返回一个方法 - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22765265/