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

标签 java concurrency threadpool executorservice

我正在开发一个玩 TicTac toe 的程序。

它将使用博弈树搜索。然而,首先我需要组装游戏树。

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

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

这是我的移动生成代码:

@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);

我尝试使用 transient 线程池,但程序陷入困境并耗尽了线程。

基本上,发生的情况是一个任务在线程池中运行,然后每个任务生成更多任务在单独的线程中运行。

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

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

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

最佳答案

尝试java.util.concurrent.Phaser

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

关于Java:线程池的递归线程创建 -> 如何检测完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26567315/

相关文章:

go - 选择 channel 时陷入死锁

Java 杀死或终止一个线程

python - 当QThreadPool不为空时退出?

java - 读取单词的第一个字母并选择其字母表的编号

java - 什么是NullPointerException,我该如何解决?

java - 无法理解这个输出

ssl - 是否可以线程池 IMAP 连接?

java - 从哪里获得 com.sun.xml.internal 包的源代码?

php - MyISAM数据库由于并发导致数据错误

java - Android AsyncTask.THREAD_POOL_EXECUTOR 与自定义 ThreadPool 与 Runnables