Java 从与其不同的线程执行方法';他是从哪里打来的

Java 从与其不同的线程执行方法';他是从哪里打来的,java,multithreading,Java,Multithreading,我正在制作一个使用每客户端线程模型的游戏。游戏的运行使得每半秒所有玩家都需要更新。所有更新都必须在半秒钟的时间间隔内发生,因此它们需要同时执行。我的想法是让一门课记录何时需要进行“全局更新”,然后在时机成熟时,检查所有玩家并告诉他们进行更新: for(Player p : currentPlayers) { p.update(); } 问题是,因为每个玩家都有自己的线程,我希望玩家利用这个事实,因为它已经存在了。如果我从另一个类进行更新,那么有一个线程执行几百个线程可以单独执行的

我正在制作一个使用每客户端线程模型的游戏。游戏的运行使得每半秒所有玩家都需要更新。所有更新都必须在半秒钟的时间间隔内发生,因此它们需要同时执行。我的想法是让一门课记录何时需要进行“全局更新”,然后在时机成熟时,检查所有玩家并告诉他们进行更新:

 for(Player p : currentPlayers) {
     p.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) { } } } } } 公共类伪示例实现可运行 { //假设“玩家”都是活跃玩家。 私人玩家[]玩家=新玩家[100]; private long lastUpdate=System.currentTimeMillis(); 公开募捐 { while(true) { 如果(System.currentTimeMillis()-lastUpdate>=500) { 对于(玩家p:玩家) { p、 更新=真; } } 尝试 { 睡眠(10); }捕捉(中断异常e) { } } } 私有类播放器实现Runnable { 私有布尔更新=false; 公开募捐 { while(true) { 如果(更新) { //在这里做更新。。。 } 尝试 { 睡眠(10); }捕捉(中断异常e) { } } } }
} 我认为处理这个问题的最好方法是不调用p.update(),而是向p发送一条异步消息。这将使用该功能。这可能是最干净的方法,尽管我相信消息传递会产生一些(可能很小的)开销

因此,在您的ticking线程(即调用全局更新的线程)中,每个客户机线程都有一个对处理程序对象的引用。然后,你看起来就像

for (Player p : currentPlayers) {
    p.handler().sendMessage(); // this isn't exactly the syntax
}
在您的播放器中,您将拥有一个PlayerHandler对象,该对象扩展Handler并覆盖handleMessage(消息)


编辑:对这个问题的评论是好的——不要使用超过你需要的线程。它们似乎是“正确”的抽象,但它们引入了大量潜在的棘手问题。如果所有计算都需要在两个刻度之间完成,那么不管是否按顺序完成。

从不同线程执行方法的唯一方法是从不同线程执行它。队列对于传递控制信息很有用。然而,这个设计开始听起来。。。复杂。吻特别是在穿线方面。它不像听起来那么难。我正在考虑尝试一种“准备更新”标志,然后一旦每个线程进行了更新,它就会重置标志。不,这真的很难。为什么需要多个线程?线程之间的交互是如何工作的?如何/在何处控制同步?时间共享和事件处理是如何有序进行的?线程实际上会降低程序的速度,除非有并行化的东西。很难做到这些,特别是在有很多共享状态的情况下。线程不是演员:-)我建议亲吻。并使用队列[跨线程]控制信息。分离IO层(一个线程中的异步和/或每个IO的线程)和处理(一个或两个集中式线程)。我说这“很可能是错误的方法”,同时尽量不那么直截了当。你在那里发布的代码看起来是可以的,但很难保证不会有比赛条件或奇怪的事件序列。一个小错误:您没有更新lastUpdate;)您还需要在//do updating结束时将“update”设置回false。。。(尽管你可能知道)