Dav*_*les 7 java multithreading
我正在尝试测试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]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
当前设计的问题是游戏对象看起来不是线程安全的。您可能需要为每个 Runnable 一个新的游戏对象。
| 归档时间: |
|
| 查看次数: |
1599 次 |
| 最近记录: |