2014-05-13 4 views
-2

wait 및 notify를 사용하여 특정 메서드가 호출 될 때까지 스레드를 중지하려고합니다. 스레드에java.lang.IllegalMonitorStateException wait 및 notify

가있는 방법이 있습니다 : 나는 현재 그것을 다음과 같이 설정을 가지고

public void toggleTurnOver(){ 
    if(turnOver == false){ 
     turnOver = true; 
     synchronized(this){ 
      for(Player p: playerList){ 
       p.notify(); 
      } 
     } 
    }else{ 
     turnOver = false; 
    } 
} 

이 방법이 스레드에있는 다른 대기 깨어 난 무엇 될 것입니다 :

     synchronized(myGame){ 
         if(!myGame.getTurnOver()){ 
          try { 
           wait(); 
          } catch (InterruptedException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
          pr.println(myGame.getTurnOver()); 
          pr.flush(); 
         } 
        } 

동일한 객체에서 동기화되므로 예외를 던지게 될 요소가 무엇인지 확실하지 않습니다. 어떤 아이디어?

가 발생

정확한 오류가 입니다 다음 documentation

Exception in thread "Thread-3" Exception in thread "Thread-2" java.lang.IllegalMonitorStateException 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:503) 
    at Player.run(Player.java:112) 
java.lang.IllegalMonitorStateException 
    at java.lang.Object.notify(Native Method) 
    at Game.toggleTurnOver(Game.java:764) 
    at Game.run(Game.java:386) 

답변

3

첫 번째 문장 : 슬로우

스레드가 오브젝트의 모니터로 기다리는 것을 나에 대기 다른 스레드에 통보를 시도한 것을 나타 내기 위해 지정된 모니터를 소유하지 않고 개체의 모니터 .

당신은 p에 통지된다, 그래서 당신은 p에 동기화 할 수 있습니다

for(Player p: playerList) { 
    synchronized(p){ 
    p.notify(); 
    } 
} 
대기

똑같은

: 당신이 기다리고있어 개체에 동기화 할 필요가 (가정이 코드에 Player 클래스) :

if(!myGame.getTurnOver()){ 
    try { 
     synchronized(this){ 
      wait(); 
     } 
    } catch (InterruptedException e) { 
     // ... 
    } 
} 
+0

문서의 첫 번째 문장 일뿐만 아니라 상속 된 생성자를 제외한 유일한 문장이기도합니다. – Ordous

0

인터넷에서 내가 좋아하는 page을 인용 :

스레드를 개체 m에 대한 wait 메서드를 실행하는 스레드라고하고, n을 잠금 해제 작업과 일치하지 않은 m 개의 t에 의한 잠금 동작 수로 둡니다. 다음 작업 중 하나가 발생합니다.
- n이 0이면 (즉, 스레드 t가 대상 m에 대한 잠금을 아직 보유하지 않은 경우) IllegalMonitorStateException이 발생합니다.
-이 있듯이 ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ

, 당신은 통지 호출 같은 객체에 동기화 할 필요가 없습니다, 그것은 또한 당신이 기다리고에 통지하는 동일한 개체 수 있습니다. 이 경우에 myGame에서 동기화 중이지만 기다리며 알림을 보내고 있습니다. Player

관련 문제