我正在使用每客户端线程模型开发游戏。游戏的运行使每半秒都需要更新所有玩家。更新都必须在半秒间隔内发生,因此它们需要同时执行。我的想法是建立一个能够跟踪"全局更新"需要发生,然后在时机成熟时,通过所有玩家并告诉它更新:
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) { } } } } }
答案 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)。
编辑:对问题的评论很好 - 不要使用比你需要的更多的线程。它们似乎是“正确的”抽象,但它们引入了大量潜在的棘手问题。如果你的所有计算都需要在滴答之间完成,那么它是否顺序完成可能并不重要。