当时间限制到达时返回一个方法 - java

时间:2014-03-31 15:09:23

标签: java time-limiting

我刚开始学习编程(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()但我完全迷失了如何使用它(我读了一些关于多线程但我只是不明白这是什么) 如果有人能帮助我,我将非常感激!感谢

2 个答案:

答案 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