我正在制作一个玩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有关,但我不知道如何解决这个问题。
答案 0 :(得分:1)
尝试java.util.concurrent.Phaser
。
在创建每个任务时使用register()
增加计数。在每项任务结束时,请致电arriveAndDeregister()
。