0

我想实现迭代深化(增量树构建)。这是我将询问的代码的一部分:

        ExecutorService executorService = Executors.newSingleThreadExecutor();

        Set<Callable<Integer>> callables = new HashSet<Callable<Integer>>();

        callables.add(new Callable<Integer>() {
            public Integer call() throws Exception {
                iterativeDeepening(depthLimit, board);
                return -1;
            }
        });
        callables.add(new Callable<Integer>() {
            public Integer call() throws Exception {
                Thread.sleep(500);
                return 1;
            }
        });
        try{
            executorService.invokeAny(callables, 1000, TimeUnit.MILLISECONDS);
        }catch(TimeoutException | InterruptedException ex){
            executorService.shutdown();
        }

        executorService.shutdown();

从我读到的关于带有时间限制的 invokeAny() 的内容中,它应该在达到最后期限后立即结束执行其 Callable 对象。当我长时间睡眠而不是我的函数 iterativeDeepening(depthLimit, board) 时,它会起作用。如何使它与我的功能一起使用?下面我将代码粘贴到这个函数中:

    public void iterativeDeepening(byte depthLimit, byte[] board){

    for(byte depth=1;depth<depthLimit;depth++){
        GameTree gameTree= new GameTree();
        byte[] tempBoard = new byte[14];
        for(byte i=0;i<14;i++){
            tempBoard[i] = board[i];
        }
        Node <byte[]> root= new Node<byte[]>(tempBoard, player);
        try {
            gameTree.buildGameTree(depth, root);
        } catch (OutOfMemoryError E) {
            gameTree.eraseGameTree(depth,root);
            System.gc();
        }

        MiniMax minimax = new MiniMax(player);
        move= minimax.selectMove(depth, root);

    }
}

如果您知道更好的方法或知道如何成功停止执行我的功能,请告诉我。我还尝试了本主题中提到的可运行接口: How to stop execution after a certain time in Java? 但它只是工作相同。

4

1 回答 1

1

达到超时后,ExecutorService将尝试通过调用Thread.interrupt()它们来中断所有当前正在运行的任务。这将使每个线程进入中断状态。sleep()设置此状态时退出。

所以添加这个检查:

if(Thread.currentThread().interrupted()) {
    return;
}

在你的函数内部应该完成这项工作。

线程终止提示:

try{
    executorService.invokeAny(callables, 1000, TimeUnit.MILLISECONDS);
} catch(TimeoutException | InterruptedException ex){
    //... ignore
} finally {
    executorService.shutdown();
    executorService.awaitTermination(); <-- add this line if you want to wait for the computation to end
}

更新

这不是一个解决方案,因为在循环中有一个函数 gameTree.buildGameTree(depth, root); 这本身有时需要比最后期限更长的时间,这是至关重要的。

据我所知,没有办法从外部中断这种功能。这个函数应该不时检查它的状态。如果是循环,请考虑检查部分或全部迭代的状态。

于 2013-10-26T19:01:16.527 回答