多线程循环赛

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)

Mic*_*sel 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
Run Code Online (Sandbox Code Playgroud)

当前设计的问题是游戏对象看起来不是线程安全的。您可能需要为每个 Runnable 一个新的游戏对象。