2011-11-19 5 views
0

스레드 클래스의 wait() 메서드와 혼동이 있습니다. wait() 메서드는 동기화 된 컨텍스트에서 항상 호출되는 것으로 알려져 있습니다. 그러나 wait 메소드를 실행 한 후에는 해당 스레드가 보유한 객체에 대한 잠금을 해제합니다.대기 메서드 혼동

"스레드가 객체의 대기 풀에 들어가면 가면 잠금이 해제됩니다."라고 물어보십시오.

답변

1

예. 그것의 꽤 명확의 javadoc에 명시된 : 이

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#wait()

공공 최종 무효 대기 대기() 는 예외 : InterruptedException이

다른 스레드가 통지() 메소드를 호출 할 때까지 현재의 thread를 대기시킵니다 또는이 객체의 notifyAll() 메소드 즉,이 메서드는 호출 대기 (0)를 수행하는 것처럼 동작합니다. 현재 스레드가이 객체의 모니터를 소유해야합니다. thread는,이 모니터의 소유권을 해제 해, notify 메소드 또는 notifyAll 메소드의 호출에 의해, 다른 thread가이 객체의 모니터로 대기 중의 thread에 통지 할 때까지 대기합니다. 그런 다음 스레드는 모니터의 소유권을 다시 확보하고 실행을 재개 할 때까지 기다립니다.

이 메서드는이 개체 모니터의 소유자 인 스레드에 의해서만 호출되어야합니다. 스레드가 모니터의 소유자가 될 수있는 방법에 대한 설명은 notify 메소드를 참조하십시오.

예외 : IllegalMonitorStateException - 현재 스레드가 객체 모니터의 소유자가 아닌 경우. InterruptedException - 다른 스레드가 현재 스레드를 인터럽트 한 경우. 이 예외가 throw되면 (자), 현재의 thread의 인터럽트 상태가 클리어됩니다. 항목 : 이

+0

감사 :

오라클은이 모든 정보를 다루고 상당히 자세한 자습서를 제공합니다. 한가지 더 기다려야하는 동일한 객체에 대해 notify() 메서드를 호출해야합니까? – aj983

+0

예, 해당 개체가 모니터를 소유하고 있기 때문에 –

0

http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#wait()가

다른 스레드가이 객체에 대한 통지() 메서드 또는 notifyAll() 메소드를 호출 할 때까지, 현재의 thread를 대기시킵니다)()의 notifyAll를 (통보 .

그리고 두 번째 질문에 대답 : 결코합니다. 마지막 질문에서와 같이 잠금 장치가 임의로 해제되지는 않습니다. 이렇게하면 동기화가 중단됩니다.

http://download.oracle.com/javase/tutorial/essential/concurrency/

+0

고마워요. 한가지 더 기다려야하는 동일한 객체에 대해 notify() 메서드를 호출해야합니까? – aj983