从与调用它不同的线程执行方法

时间:2012-04-13 00:30:16

标签: java multithreading

我正在使用每客户端线程模型开发游戏。游戏的运行使每半秒都需要更新所有玩家。更新都必须在半秒间隔内发生,因此它们需要同时执行。我的想法是建立一个能够跟踪"全局更新"需要发生,然后在时机成熟时,通过所有玩家并告诉它更新:

 for(Player p : currentPlayers) {
     p.update();
 }

问题在于,由于每个玩家都有自己的线程,我希望玩家能够利用这个事实,因为它已经存在。如果我从另一个类中查看更新,那么有一个线程执行几百个线程可以单独执行的操作。如何设计它,以便线程调用方法' update()'在类Player中,一个与调用它的线程不同的线程执行它,或者可能是一个可以实现相同目标的不同方法?

如果您需要任何澄清,请询问!非常感谢!

更新:你们对此有什么想法(我无法弄清楚如何在帖子中格式化大量代码!):

更新2:刚才意识到我需要知道所有玩家何时完成更新以重置上次...

public class PseudoExample implements Runnable
{
    // Assume 'players' is full of active players.
    private Player[] players = new Player[100];
    private long lastUpdate = System.currentTimeMillis();

    public void run()
    {
        while (true)
        {
            if (System.currentTimeMillis() - lastUpdate >= 500)
            {
                for (Player p : players)
                {
                    p.update = true;
                }
            }

            try
            {
                Thread.sleep(10);
            } catch (InterruptedException e)
            {

            }
        }
    }

    private class Player implements Runnable
    {
        private boolean update = false;

        public void run()
        {
            while (true)
            {
                if (update)
                {
                    // Do updating here ...
                }

                try
                {
                    Thread.sleep(10);
                } catch (InterruptedException e)
                {

                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我认为处理此问题的最佳方法是调用p.update(),而不是调用p.update()。这将使用Handler功能。这可能是最干净的方式,虽然我相信消息传递会产生一些(可能是微不足道的)开销。

因此,在您的滴答线程(即调用全局更新的线程)中,您将为每个客户端线程引用一个Handler对象。然后,你看起来像

for (Player p : currentPlayers) {
    p.handler().sendMessage(); // this isn't exactly the syntax
}

在您的播放器中,您将拥有一个扩展Handler的PlayerHandler对象并覆盖handleMessage(Message)。

编辑:对问题的评论很好 - 不要使用比你需要的更多的线程。它们似乎是“正确的”抽象,但它们引入了大量潜在的棘手问题。如果你的所有计算都需要在滴答之间完成,那么它是否顺序完成可能并不重要。