【问题标题】:How to stop a process with time constraints如何停止有时间限制的进程
【发布时间】:2010-11-13 13:29:30
【问题描述】:

我觉得这个话题可能不够准确,但我真的不知道如何用很简短的方式来描述它......

我想做的如下: 我有一个进程正在运行一些分析(在 Java 中)并试图给出一个返回值,但整个分析有一个时间限制,比如 10 秒

如果分析在 10 秒内给出结果, 返回结果; 别的, 达到 10s 时超时,停止进程并返回一个虚拟值

我是这个领域的新手,欢迎任何建议。

【问题讨论】:

    标签: java time event-handling constraints listener


    【解决方案1】:

    您可以使用 FutureTask 创建作业并在特定时间内请求结果(使用 get() 并设置超时)。如果违反了该时间窗口,那么您将获得例外。

    此时您可以调用cancel() 方法并将参数设置为true to 强制中断并取消底层任务。

    Object result = DUMMY;
    try {
       result = futureTask.get(5, TimeOut.SECONDS);
    }
    catch (TimeoutException e) {
       futureTask.cancel(true);
    }
    

    【讨论】:

    • 我认为您不需要取消。它说:“抛出:TimeoutException - 如果等待超时”
    • 是的,但是提问者 then 希望取消底层任务,我认为这与 get() 没有及时收到值不同
    • 异常不算作取消操作吗?也许没有。
    【解决方案2】:

    您可以使用计时器 (java.util.Timer),您可以通知线程,然后当计时器到期时,它可以告诉线程停止。

    更好的解决方案是将进程生成到它自己的线程中,然后告诉您的主线程等待处理线程并休眠 10 秒。完成后,您可以向线程发送停止信号。注意:我不会使用 stop() 方法,而是通过同步方法发送信号或设置值,该同步方法在执行过程中每隔一段时间就会检查一次。

    【讨论】:

    • 哇,我应该截个图:我们的两个答案都说“已回答 0 秒前”。
    • 请注意 stop() 已弃用
    • @Brian 是的,我应该更清楚为什么我不会使用它:P
    【解决方案3】:

    看看java.util.concurrent.Future,尤其是get(long timeout, TimeUnit unit)方法:

    如有必要,最多等待给定的时间以完成计算,然后检索其结果(如果可用)。

    【讨论】:

    • 单独调用 get() 并不能解决这个问题,因为问题明确指出“停止进程”
    【解决方案4】:

    我在编写一个使用 Minimax 的游戏 AI 时遇到了类似的问题,要求是在 5 秒内移动返回。我使用 Timer 在我的代码中设置了一个布尔标志进行了测试,该标志被定期检查,与使用 System.currentTimeMillis() 的调用相比没有性能提升。

    因此,如果您要返回的虚拟值实际上是一些部分解决方案,我建议您将系统时间存储在 long 中,并定期检查是否已到 10 秒并返回您剩余的任何值。

    否则,使用 FutureTask 并在超时时调用它的 get 方法。不过,Brian 没有提到的一件事是,执行处理的代码必须定期检查它是否已被定期中断,以便提前真正停止执行。

    【讨论】:

    • 这是一个很好的观点。中断,因为我相信它们只会在 IO 调用中中断线程
    猜你喜欢
    • 2016-12-13
    • 2019-04-23
    • 2012-08-15
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2010-11-12
    相关资源
    最近更新 更多