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。。。(尽管你可能知道)