多线程循环赛

时间:2011-05-02 11:42:12

标签: 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]);
        }
    }
}

3 个答案:

答案 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来说几乎是一样的。

完成后,请回来询问有关您自己尝试的问题的其他问题。

当然,您可能会在此处获得另一个答案,告诉您该怎么做。但 ,请勿阅读该答案。在进一步学习之前,了解基础知识至关重要。否则,当您的应用停止工作时,您将完全迷失。