Java:线程池的递归线程创建 - >如何检测完成情况

时间:2014-10-25 21:15:49

标签: java concurrency threadpool executorservice

我正在制作一个玩TicTac脚趾的程序。

它将使用游戏树搜索。但是,首先我需要组装游戏树。

我想并行化这个过程,因为它基本上涉及检查当前位置,生成所有合法移动,并将这些作为节点附加到当前节点。

这是我第一次真正涉足多线程,我一直遇到问题。

这是我的移动生成代码:

@Override
    public void run() {
        for (int i = 1; i < 10; i++) { // try all cells
            if (isMoveLegal(i)) {
                Node newnode = new Node(currentNode,
                        Game.convertMoveToBin(i - 1));
                currentNode.addChild(newnode);
                if (Game.evaluateBoards(newnode.getBoards()) == 2) {
                    executor.submit(new MoveGenerationThread(currentNode,
                            newnode));
                }
            }
        }
        executor.shutdown();
 }}

我有一个静态线程池执行器:

public static final ExecutorService executor = Executors.newFixedThreadPool(THREADS);

我尝试过使用临时线程池,但程序已经过去了,并且没有线程。

基本上,正在发生的事情是在线程池中运行任务,然后每个任务生成更多任务以在不同的线程中运行。

问题在于什么时候一切都结束了。我不只是运行一个简单的循环,我可以等到任务完成,这是递归完成的。我已经尝试了各种检测完成的方法,包括CountDownLatch(没有工作,我不知道将要完成多少任务),wait()(崩溃,没有&t; t)似乎适用于这种情况)和shutdown(),它也不起作用(我不想阻止更多的任务被提交)。

我在这里有点困惑,有什么想法吗?

我认为答案可能与Fork / Join有关,但我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

尝试java.util.concurrent.Phaser

在创建每个任务时使用register()增加计数。在每项任务结束时,请致电arriveAndDeregister()