我正在为一款类似国际象棋的游戏实现 AI。我打算使用递归来尝试所有可能的棋盘状态并选择“最佳着法”。
由于每次移动的时间限制,我需要有一些机制来在达到时间限制时中断这些递归过程。当然,我可以在进行递归调用之前继续检查时间,如果当前时间接近限制则中断,但这是对我的程序性能的权衡。
如果有一种方法可以在计时器结束时中断这些递归过程,那就太好了。但是,由于我是 Java 的新手,我不知道在 Java 中是否有任何方法可以做到这一点?你能给一个示例代码吗? :)
最佳答案
检查时间,例如System.currentTimeMillis() 每次调用花费大约 200 ns。但是,如果这对您来说太过分了,您可以让另一个线程设置一个停止标志。
已经有一种机制可以做到这一点。
ExecutorService es = Executors.newSingleThreadExecutor();
Future f = es.submit(new Runnable() {
@Override
public void run() {
long start = System.nanoTime();
while(!Thread.interrupted()) {
// busy wait.
}
long time = System.nanoTime() - start;
System.out.printf("Finished task after %,d ns%n", time);
}
});
try {
f.get(1, TimeUnit.SECONDS); // stops if the task completes.
} catch (TimeoutException e) {
f.cancel(true);
}
es.shutdown();
打印
Finished task after 1,000,653,574 ns
注意:您不需要每次都启动/停止 ExecutorService。
关于java - 时间用完时中断java中的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5900776/