2012-04-13 65 views
1

我正在使用线程每客户端模型的游戏。游戏运行时,每半秒钟所有玩家都需要更新。所有更新都必须在半秒内完成,因此需要全部同时执行。我的想法是有保留的,当“全局更新”需要做的,然后在时机成熟时,通过所有的球员,并告诉它更新曲目类:从一个不同于它被调用的线程执行方法从

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

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

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

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

       } 
      } 
     } 
    } 
}
+1

从不同线程执行方法的唯一方法是从另一个线程执行它。队列对传递控制信息很有用。然而,这种设计听起来很复杂。吻; *特别*带线程。 – 2012-04-13 00:32:26

+0

这听起来并不难。我正在考虑尝试一种“准备更新”的标志,然后一旦每个线程都进行了更新,就会重置标志。 – 2012-04-13 00:35:48

+0

不,这确实很难。为什么需要多个线程?线程之间的交互如何工作?如何/在哪里同步控制?时间分享和事件处理如何保持有序?等等等等。除非有事物被平行化,否则线程实际上会减慢程序的速度。而且很难让这些更正确,特别是在拥有大量共享状态的情况下。主题*不是*参与者:-) – 2012-04-13 00:36:59

回答

2

我认为最好的方式来处理,这将是代替调用p.update(),你可以发送异步消息页。这将使用Handler功能。这可能是最干净的方式,但我相信消息传递会发生一些(可能微不足道的)开销。

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

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

,并在您的播放器,你将有一个扩展处理程序和覆盖的handleMessage(消息)一个PlayerHandler对象。

编辑:关于这个问题的意见是好的 - 不要使用比你需要更多的线程。它们看起来可能是“正确的”抽象,但它们引入了大量潜在的棘手问题。如果你所有的计算都需要在两次滴答之间完成,那么顺序执行与否可能无关紧要。

相关问题