我刚开始学习编程(2周前),我正在尝试为游戏制作机器人。在bot的主类中,有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,方法是否完成运行。我已经阅读了关于番石榴SimpleTimeLimiter和callWithTimeout()但我完全迷失了如何使用它(我读了一些关于多线程但我只是不明白这是什么) 如果有人能帮助我,我将非常感激!感谢
答案 0 :(得分:1)
给定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()
的检查与为超时进行手动检查没有太大区别。所以在一个线程中运行,你仍然必须相信你的功能,但可能有更好的助手可用于那种事情(例如番石榴)。
如何执行此操作的示例留作练习,但如果您在单独的进程中运行您的函数(或者支持强制停止线程的语言中的线程,例如Erlang,Ruby,其他),那么您可以使用如果在超时后没有完成,则操作系统会终止该进程。
让该过程返回部分结果将具有挑战性。它可以通过管道定期向调用进程发送“正在进行的工作”,或定期将工作保存到文件中。
答案 1 :(得分:0)
使用Java的Timer包,但这需要您理解线程和方法覆盖等概念。然而,如果这是你所需要的,答案与这个问题非常相似How to set a timer in java