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

标签 java multithreading

我正在使用每个客户端线程模型开发一款游戏。游戏的运行方式是每半秒所有玩家都需要更新一次。所有更新都必须在半秒间隔内发生,因此它们需要同时执行。我的想法是有一个类来跟踪“全局更新”何时需要发生,然后当时间到来时,遍历所有播放器并告诉它更新:

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

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

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

更新:你们对此有何看法(我不知道如何格式化帖子中的大量代码!):

更新 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)
                {

                }
            }
        }
    }
}

最佳答案

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

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

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

在您的 Player 中,您将有一个 PlayerHandler 对象,该对象扩展 Handler 并覆盖 handleMessage(Message)。

编辑:对这个问题的评论是好的 - 不要使用比您需要的更多的线程。它们可能看起来是“正确的”抽象,但它们引入了大量潜在的棘手问题。如果所有计算都需要在时钟周期之间完成,那么是否按顺序完成可能并不重要。

关于java - 从与调用方法不同的线程执行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10133750/

相关文章:

java - 为什么Thread.isInterrupted()总是返回false?

java - 如何让两个线程通过处理程序进行通信?

c# - 如何通过主线程的名称挂起一个线程?

java - 如何正确设计具有内部条件转换的游戏状态机

ruby - 确定 ruby 线程状态

python - 如何计算自 python 程序启动以来已经过去了 1 小时?

java - 将 Cron 作业与 Appengine Endpoints API 结合使用

java - 不执行该操作的 "int create()"方法应该返回什么值?

Java Vaadin 6 至 7 升级

java - 如何使用java在同一目录中创建多个同名文件?