我正在尝试测试8种不同的游戏算法。这些算法可以在游戏界面之后对抗彼此不同类型的游戏。
所以,他们必须互相对抗100场比赛。我已经完成了这一部分并且工作正常。现在,我正在努力使其成为多线程,以利用朋友的计算机的8核。
我使用线程的经验很少。那么,为了使我的代码多线程,我必须做出哪些改变?
以下是我的单线程版本的代码。
编辑:我想到的解决方案(我的基本知识)是关于制作一个Match类,它需要两个玩家和他们想要玩的游戏。该类将实现Runnable,我可以为每个游戏创建一个线程。我现在的问题是,一旦run()方法完成,我将如何通知结果?由于
for (int p1 = 0; p1 < allPlayers.length; p1++)
{
for (int p2 = p1 + 1; p2 < allPlayers.length; p2++)
{
for (int t = 0; t < trials; t++)
{
int player1 = t % 2 == 0 ? p1 : p2;
int player2 = t % 2 == 0 ? p2 : p1;
Player[] players = new Player[] { allPlayers[player1], allPlayers[player2] };
game.newGame();
while (!game.isFinished())
game.playNthMove(players[game.currentPlayer()].move(game));
data[p1][p2][t] = getCharValue(game.getOutcome()[t % 2 == 0 ? 0 : 1]);
data[p2][p1][t] = getCharValue(game.getOutcome()[t % 2 == 0 ? 1 : 0]);
}
}
}
答案 0 :(得分:3)
您不需要修改单线程实现的代码 - 您只需要创建一个实现Runnable接口的类并将该功能包装在run()方法中。然后,您可以在该类的实例中传递一个Thread,并调用Thread.start()
。
请参阅this以获取参考。
编辑:如何从该帖子获取结果:
看起来可调用接口就是您正在寻找的。这是link,其中包含有关如何使用它的基本说明。它需要有关Runnable接口如何用于创建没有结果的多线程应用程序的基本知识,因此我建议首先阅读this。
答案 1 :(得分:2)
Collection<Callable<Void>> tasks = new ArrayList<Callable<Void>();
for (int p1 = 0; p1 < allPlayers.length; p1++)
{
for (int p2 = p1 + 1; p2 < allPlayers.length; p2++)
{
for (int t = 0; t < trials; t++)
{
final int player1 = t % 2 == 0 ? p1 : p2;
final int player2 = t % 2 == 0 ? p2 : p1;
final Player[] players = new Player[] { allPlayers[player1], allPlayers[player2] };
final int trial = t;
tasks.add(new Callable<Void>() {
public Void call() {
game.newGame();
while (!game.isFinished())
game.playNthMove(players[game.currentPlayer()].move(game));
data[p1][p2][t] = getCharValue(game.getOutcome()[t % 2 == 0 ? 0 : 1]);
data[p2][p1][t] = getCharValue(game.getOutcome()[t % 2 == 0 ? 1 : 0]);
return null;
}
});
}
}
}
executor.invokeAll(tasks); // called on an exector, will wait for all tasks to complete
当前设计的问题是游戏对象看起来不是线程安全的。你可能想要为每个Runnable创建一个新的游戏对象。
答案 2 :(得分:1)
没有魔法子弹。在提出问题之前,您需要了解基础知识。首先阅读MSDN上的这篇文章:http://msdn.microsoft.com/en-us/magazine/cc163744.aspx。对于Java来说几乎是一样的。
完成后,请回来询问有关您自己尝试的问题的其他问题。
当然,您可能会在此处获得另一个答案,告诉您该怎么做。但 请 ,请勿阅读该答案。在进一步学习之前,了解基础知识至关重要。否则,当您的应用停止工作时,您将完全迷失。