java - 当时间限制结束时返回一个方法 - java

标签 java time-limiting

我刚刚开始学习编程(两周前),我正在尝试为游戏制作一个机器人。在机器人的主类中,有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/

相关文章:

java - Hadoop Job静默失败

java - Dagger:在提供的 pojo 上注入(inject)字段

java - 为什么我在 BUILD SUCCESS 中收到此错误?

c - 使用for循环时,如何修复某些测试用例中的 'time limit exceeded'?

python - 欺诈事件通知中出现超时错误 HackerRank

java - 在类中保存密码的最理想方式 - Java

java - 使用 <context :property-placeholder> in a factory method 定义的属性

c++ - 如何限制cin中的输入时间限制?

java - 如何在Android上写好 "time limited features"?

java - 完全退出 Java 方法