Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何停止有时间限制的流程_Java_Time_Event Handling_Constraints_Listener - Fatal编程技术网

Java 如何停止有时间限制的流程

Java 如何停止有时间限制的流程,java,time,event-handling,constraints,listener,Java,Time,Event Handling,Constraints,Listener,我认为这个话题可能不够准确,但我真的不知道如何用一种非常简短的方式来描述它 我想做的事情如下: 我有一个进程运行一些分析(Java)并试图给出一个返回值,但是整个分析有一个时间限制,比如说10秒 如果分析在10秒内给出结果, 返回结果; 其他的 达到10秒时超时,停止进程并返回一个伪值 我是这个领域的新手,欢迎提出任何建议。看看,特别是方法: 如果需要,最多等待给定的时间以完成计算,然后检索其结果(如果可用) 您可以使用一个计时器(java.util.timer),您可以通知线程,然后当计时器过

我认为这个话题可能不够准确,但我真的不知道如何用一种非常简短的方式来描述它

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

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

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

看看,特别是方法:

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

您可以使用一个计时器(java.util.timer),您可以通知线程,然后当计时器过期时,它可以告诉线程停止

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

您可以使用创建作业并在特定时间内请求结果(与超时一起使用)。如果该时间窗口被打破,那么您将得到一个异常

此时,您可以调用参数设置为
true的方法,强制中断并取消基础任务

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

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

因此,如果您想要返回的虚拟值实际上是某个部分解决方案,我建议您将系统的时间存储在一个较长的时间段中,并定期检查,以查看您的10秒是否已满,并返回剩余的值


否则,请使用FutureTask并在超时时对其调用get方法。Brian没有提到的一件事是,执行处理的代码必须检查是否定期中断,以便尽早停止执行。

哇,我应该截图:我们的答案都是“0秒前回答”。注意stop()是deprecated@Brian是 啊我应该更清楚我为什么不使用它:PI不认为你需要取消。它说:“抛出:
TimeoutException
-如果等待超时”是的,但发问者随后希望取消基础任务,我认为这与get()没有接收到时间值不同异常不算作取消操作吗?可能没有。单独调用get()并不能解决这个问题,因为问题明确表示“停止进程”,这是一个很好的观点。中断,因为我相信它们只会在IO调用时中断线程