嗨,我正在尝试使用 Java 套接字编程制作多人游戏。我的服务器正在使用多线程环境。问题是,我希望当两个玩家都连接到服务器时,他们可以继续前进,否则不会......因为这个原因我使用循环运行 2 次并接受来自两个客户端的连接。在循环中我使用线程对象并调用它的等待方法。当循环完成时,我调用 obj.notifyALl 方法,以便当前线程和上一个线程三人应该醒来,他们将开始工作但我得到了这个例外......欢迎任何想法或建议......
问问题
77 次
2 回答
3
简而言之:您正在等待或通知您尚未同步的对象。
当前线程必须拥有该对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用 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 回答