java中的IllegalMonitorStateException

时间:2012-10-05 08:12:01

标签: java multithreading

您好我正在尝试使用Java套接字编程制作多人游戏。我的服务器正在使用多线程环境。问题是,我想当两个播放器都连接到服务器然后他们可以继续forword其他明智的不...这个原因我使用循环运行2次并接受来自两个客户端的连接。在循环中我使用线程对象并调用其等待方法..当循环完成时我调用obj.notifyALl方法使当前线程和之前的threed shoudl清醒,他们将开始工作但我得到这个例外...欢迎任何想法或建议.....

2 个答案:

答案 0 :(得分:3)

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

来自Object.wait()

  

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

     

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

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

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

恕我直言可能你应该使用concurrency library而不是wait / notify。

答案 1 :(得分:0)

主题应按obj.wait()调用obj.notifyAll()才能正常工作。它应该从synchronized块调用。

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

Javadoc # IllegalMonitorStateException

  

抛出此异常表示线程已尝试在对象的监视器上等待,或者在没有指定监视器的情况下通知在对象监视器上等待的其他线程。