2012-10-05 44 views
0

你好我試圖讓使用Java套接字programming.My服務器多人遊戲使用多線程enviornment.The問題是,我要當兩個玩家將連接到服務器,那麼他們可以繼續前頁其他明智的,不要.. 。對於這個原因,我有2次運行使用循環和接受來自環兩clients.and connectons我必須使用線程對象,並調用它的wait方法..When循環是結束我有打電話obj.notifyALl方法,以便目前的線程和以前的三分鐘清醒,他們將開始工作但我得到這個例外......任何想法或建議,歡迎.....拋出:IllegalMonitorStateException injava

+0

請張貼一些代碼,並顯示我們的堆棧跟蹤。這會讓別人更容易幫助你。 – Paul

回答

0

線程應該呼籲obj.wait()obj.notifyAll()爲了工作。它應該從​​塊中調用。

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

JavadoC# IllegalMonitorStateException

拋出的異常表明某一線程已經試圖等待對象的監視器,或者不擁有指定的監控,通知其他線程正在等待對象的監視器上。

3

簡而言之:你正在等待或通知還沒有同步的對象上。

Object.wait()

當前線程必須擁有該對象的監視器。線程釋放此監視器的所有權,並等待另一個線程通知對通知方法或notifyAll方法的調用,以便通知通過此對象監視器等待的線程喚醒。該線程然後等待,直到它可以重新獲得監視器的所有權並恢復執行。

如在一個參數的版本,中斷和雜散喚醒是可能的,而且這種方法應該總是在一個循環中使用:

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

拋出:IllegalMonitorStateException - 如果當前線程不是所有者該對象的監視器。

恕我直言它可能你應該使用concurrency library而不是等待/通知。

相關問題