java - 时间用完时中断java中的递归

标签 java recursion timer break chess

我正在为一款类似国际象棋的游戏实现 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/

相关文章:

loops - 如何有效地更新两个结构的值

bash - 如何在 bash 中创建秒表?

windows - 奇怪的可等待计时器 "aligning"问题

java.lang.String 无法转换为 java.util.List

java - 如何将货币的欧元符号放在输出的末尾而不是开头?

java - 入门 Java - 创建成功的二分搜索算法

linux - 什么时候使用 gethrvtime() 代替 gethrtime() 更合适

Java - 如何停止另一个类的音频剪辑

c++ - 迷宫求解程序的回溯逻辑错误

function - Prolog 中的递归函数