2013-07-07 5 views
1
class Test { 

    public static void main(String[] args) { 

     System.out.println("1.. "); 
     synchronized (args) { 

      System.out.println("2.."); 

      try { 
       Thread.currentThread().wait(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      System.out.println("3.."); 
     } 

    } 
} 

이 코드에서는 IllegalMonitorStateException 모니터 예외가 발생합니다. 때문에 문자열 배열 객체입니다 args 주위 동기화 블록, 나의 이해에 따라, 현재의 thread가 락을 획득해야하며 대기 방법, 나는 잠금을 해제입니다.IllegalMonitorStateException in code

은 누군가가 나에게이 예외 뒤에 이유를 설명 할 수 있습니까?

+0

음, 뭔가를 놓치지 않는 한 기본 스레드를 제외한 나머지 스레드는 여기에 생성되지 않습니다. 전체 스택 추적을 게시하십시오. – hexafraction

+0

어떤 라인에서 예외가 발생합니까? – zch

+4

args 객체에 대한 모니터를 들고 있지만 현재 스레드 객체에서'wait()'을 호출 중입니다. 모니터를 가지고있는 객체에서'wait()'를 호출해야합니다. 예 : 이 질문 : http://stackoverflow.com/questions/3773807/threads-synchronizing-in-java-illegalmonitorstateexception?rq=1 – confusopoly

답변

4

당신은 Thread.currentThread()wait()를 호출하고 있습니다. 모든 개체에 wait()를 호출하기 전에, 당신이 개체에 를 동기화 동기화 된 블록의 방법에 의해,이 객체의 모니터 을 소유해야합니다. 그래서없는 것은 Thread 객체에 wait()를 호출했다

synchronized(Thread.currentThread()) { 
    Thread.currentThread().wait(); 
} 

, 당신이해야 할 일이 아니다, 그리고 아마도 당신은 특히 당신이 다른이없는 점을 감안 무엇 wait() 이해되지 않았 음을 보여줍니다 thread notify() 또는 notifyAll()을 호출하는 스레드. main 메서드에 전달 된 인수를 동기화하는 것은 매우 이상한 선택입니다. wait()은 사용법이 거의 이해되지 않는 경우에도 거의 사용하지 않아야하는 매우 낮은 수준의 방법입니다. 더 나은 대답을 원하면이 코드가 실제로 원하는 것을 설명해야합니다.

+0

JB에 감사드립니다. 이것은 wait의 기능을 이해하는 나의 테스트 프로그램이었다. 나는 설명을 얻었다. –

3

스레드가 객체의 모니터에서 대기하거나 지정된 모니터

을 소유하지 않고 객체의 모니터 에서 대기 다른 스레드를 통보하려고 한 것을 나타 내기 위해서 Throw IllegalMonitorStateExceptiondocumentation

에서 부터 Object#notify()documentation

객체의 인스턴스 동기화 방법을 실행함으로써

  • :

    스레드는 다음 세 가지 방법 중 하나로 객체 모니터의 소유자가된다.

  • 개체와 동기화되는 synchronized 문의 본문을 실행합니다. 그 클래스의 동기 정적 메소드를 실행함으로써, 입력 클래스의 오브젝트에 대해서는
  • .

스레드 실행 블록이 args 객체

synchronized (args) { 
    //... 
} 

에 동기화 그래서 때문에 당신은 args.wait() 대신 Thread.currentThread().wait();를 호출해야합니다.

0

안녕 ANKIT는 난 당신이 멀티 스레딩의 기본 개념을 배우려고 노력하고 있다고 가정합니다. 좋은 온라인 자습서를 얻으려고하십시오 : http://www.javaworld.com/jw-04-1996/jw-04-threads.html

또는 기본 좋은 책을 사용해보십시오.http://www.amazon.com/SCJP-Certified-Programmer-Java-310-065/dp/0071591060/

하나의 스레드 (메인) 만 있으므로 실제로 작성한 프로그램은 동기화 할 필요가 없습니다. 나는 당신이 단지 당신의 손을 잡으려고한다는 것을 압니다. 따라서 약간의 통찰력을 제공합니다. args (args.wait())에서 wait 메소드를 올바르게 호출했거나 Thread.currentThread에서 동기화 한 경우에도 스레드는 주 스레드를 알리는 다른 스레드가 없기 때문에 무기한 대기 (프로그램이 응답하지 않음)로 들어갈 수 있습니다.

+0

yaah 나는 programm에 메인 스레드 이외의 스레드가 없다는 것을 알고 있었고, 단지 일반적인 스레딩 개념을 고수하려고했다. 나를 도와 주셔서 감사합니다. –