我正在开发一个玩 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/