1

我认为这个问题在过去已经被提出过几次,但这有点不同,我在任何地方都找不到合适的答案。
我有一个线程调用(内部run())另一个递归函数。这实际上是一个游戏引擎,递归函数是 MiniMax。
问题是,当用户在计算过程中想要退出游戏,甚至撤消动作时,我应该如何停止这个功能?

我不能用 a 中断线程boolean,因为如果已经调用了 Minimax,那么程序就在这个函数内部,线程不会检查中断条件以终止,调用interrupt()也不起作用。

如何停止这样的功能?

4

2 回答 2

1

调用 Thread.interrupt() 将在您从线程进程调用的任何 wait() 或 sleep() 处抛出 InterruptedException,还记得检查 isInterrupted() 是否“不做任何事情”。

当从睡眠/等待(或加入)中抛出 InterrupedException 时,中断状态被清除,并且对 isInterruped() 的调用将返回 false,因此请记住在 Exception 之后中断()线程。

此外,使用 boolean interrupted() 而不是 isInterrupted() 会清除中断状态,如果在调用之间没有再次中断,则使用 interrupted 进行双重检查可能会导致 true 后跟 false。

PS:还有一个建议,如果中断不够,你可以有一个队列,你可以发送消息并从正在运行的线程中使用它并解释值以停止进程(注意它不是静态标志,它是队列或相似的东西)。

于 2013-08-05T21:44:09.930 回答
1

这个解决方案实际上解决了这个问题,不太优雅,但很有创意。我在junit的 FailOnTimeout语句的源代码中找到了它。他们所做的是将Callable包装在FutureTask中,然后使用线程启动它。然后他们调用FutureTask.get(long timeout, TimeUnit unit)which 返回结果或抛出一个TimeoutException如果timeout units通过并让线程运行只要它想要。我认为同样的想法也可以在这里使用。

于 2013-08-05T21:47:52.127 回答