0

嗨,我正在尝试使用 Java 套接字编程制作多人游戏。我的服务器正在使用多线程环境。问题是,我希望当两个玩家都连接到服务器时,他们可以继续前进,否则不会......因为这个原因我使用循环运行 2 次并接受来自两个客户端的连接。在循环中我使用线程对象并调用它的等待方法。当循环完成时,我调用 obj.notifyALl 方法,以便当前线程和上一个线程三人应该醒来,他们将开始工作但我得到了这个例外......欢迎任何想法或建议......

4

2 回答 2

3

简而言之:您正在等待或通知您尚未同步的对象。

Object.wait()

当前线程必须拥有该对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知在此对象的监视器上等待的线程唤醒。然后线程等待直到它可以重新获得监视器的所有权并恢复执行。

在一个参数版本中,中断和虚假唤醒是可能的,并且应该始终在循环中使用此方法:

 synchronized (obj) {
     while (<condition does not hold>)
         obj.wait();
     ... // Perform action appropriate to condition
 }

IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者。

恕我直言,您可能应该使用并发库而不是等待/通知。

于 2012-10-05T08:15:44.133 回答
0

线程应该调用obj.wait()才能obj.notifyAll()工作。它应该从synchronized块中调用。

synchronized (obj) {
   //While condition is not true wait
}

Javadoc #IllegalMonitorStateException

抛出以指示线程已尝试在对象的监视器上等待,或通知其他线程在对象的监视器上等待而不拥有指定的监视器。

于 2012-10-05T08:14:18.813 回答