嗨,我正在尝试使用 Java 套接字编程制作多人游戏。我的服务器正在使用多线程环境。问题是,我希望当两个玩家都连接到服务器时,他们可以继续其他明智的不是......出于这个原因,我使用了 2 次循环运行并接受来自两个客户端的连接。在循环中,我使用了线程对象并调用其等待方法。循环完成后,我调用了obj.notifyALl方法,以便当前线程和以前的三元线程应该唤醒并且它们将开始工作但是我得到了这个异常...欢迎任何想法或建议.....
简而言之:您正在等待或通知尚未同步的对象。
来自 Object.wait()
当前线程必须拥有此对象的监视器。线程释放此监视器的所有权,并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知等待此对象监视器的线程唤醒。然后,线程将等待,直到它可以重新获得监视器的所有权并恢复执行。
与单参数版本一样,中断和虚假唤醒是可能的,此方法应始终在循环中使用:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者。
恕我直言,您可能应该使用并发库而不是等待/通知。
应该调用obj.wait()
才能obj.notifyAll()
工作。它应该从synchronized
块调用。
synchronized (obj) {
//While condition is not true wait
}
Javadoc # IllegalMonitorStateException
抛出以指示线程已尝试等待对象的监视器,或通知在对象的监视器上等待的其他线程,而不拥有指定的监视器。