【问题标题】:How to stop/restrict execution of some method (~when already some object is calling that)如何停止/限制某些方法的执行(〜当已经有某个对象正在调用该方法时)
【发布时间】:2010-10-17 14:30:21
【问题描述】:

我陷入了一种情况,我需要以多用户方式移动球,我正在使用 RMI 在移动 BALLS 的分布式动画中。

我的目标是以某种方式移动多个球,以便多个客户端观察球的相同运动/位置,我使用的是远程对象的球对象。

我的问题是: 我正在调用 move 函数,它是远程的,增加客户端数量会导致更频繁地调用该函数,并且由于增加 no 会导致球速越来越多来自不同客户端的对该方法的调用。

有人可以推荐我如何解决这个问题,当球已经在一个客户端上移动时,另一个球不会调用该函数而只是利用它。

这里是代码:

public void start() {
        Play = true;
        Thread t = new Thread(this);
        t.start();
    }

public void run() {

    while (Play == true) {
        runball();
        pit.repaint();
        try {
            Thread.sleep(50);
        } catch (InterruptedException ie) {
            stop();
        }
    }
}

public void runball() {

    try {
            aBall.setBounds(pit.getWidth(), pit.getHeight());
            aBall.move();
            }

        catch (Exception e) {
            e.printStackTrace();
        }
}

还有我的远程移动方法:

public  void move() throws RemoteException {
        // ... Move the ball at the give velocity.
        m_x += m_velocityX;
        m_y += m_velocityY;

    if (m_x < 0) { // If at or beyond left side
        m_x = 0; // Place against edge and
        m_velocityX = -m_velocityX;

    } else if (m_x > m_rightBound) { // If at or beyond right side
        m_x = m_rightBound; // Place against right edge.
        m_velocityX = -m_velocityX;
    }

    if (m_y < 0) { // if we're at top
        m_y = 1;
        m_velocityY = -m_velocityY;

    } else if (m_y > m_bottomBound) { // if we're at bottom
        m_y = m_bottomBound;
        m_velocityY = -m_velocityY;

    }

}

有人可以指导我吗,这个设计有一些问题,我以错误的方式使用 RMI?或者向我推荐一些可以实现我的目标的设计。

非常感谢,

吉比

【问题讨论】:

  • 您是说如果球已经在移动,那么在球停止移动之前应该忽略其他请求?
  • “你是说如果球已经在移动,那么额外的请求应该被忽略”是的,“直到球停止移动”这还不是问题。
  • @static void main - 这可能是一个问题 - 请阅读下面 Stephen C 的帖子。如果客户端逐步将球移动到其目的地,则服务器没有机制知道客户端何时完成整个移动并完成。如果必须这样做,您将需要向服务器添加“锁定”和“解锁”功能。然后,客户端将能够拥有服务器,直到移动完成。请注意,如果客户端没有发出 unlock(),但您可能会遇到问题。
  • 每个客户移动自己的球还是共享一个球?很抱歉很密集,但是 start()、run() 和 runBall() 方法是客户端的一部分还是服务器的一部分?
  • 我以为你在谈论实现同步,这不是这里的问题。我只是想停止执行移动,因为没有更多的调用提高速度。比如 1 秒 = 1 调用,对于两个客户端1 秒 = 2 次通话,它会导致速度增加,所以我想忽略第二次通话。

标签: java implementation rmi distributed-computing


【解决方案1】:

我认为您的客户不应该告诉服务器移动球。

相反,应该有一个服务器线程以所需的速率移动球。客户端应该简单地询问服务器当前球在哪里。

【讨论】:

  • 当客户端代码得到结果时,信息很可能已经过时了。我不认为告诉服务员把球放在哪里是一个坏主意。如果他用望远镜瞄准呢?
  • 除非客户端将球分块移动到其最终目的地,而不是仅仅命名目的地并让服务器代码将其移动到那里。在上面的代码中很难说为什么会有循环。
  • 问题是他有N个客户端都告诉服务器移动球。如果你看看“move()”是做什么的,你就会明白为什么这是个问题。
  • @Static Void Main - 我意识到了这一点。我只是不明白你为什么设计系统让客户控制“物理”。
  • 循环只不过是一个通用的“游戏循环”,在这种情况下更新对象(移动球一步)并渲染新图形。
猜你喜欢
  • 2012-05-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 2020-04-21
  • 2021-06-08
  • 1970-01-01
  • 2018-02-15
相关资源
最近更新 更多