Java 대기 및 알림: IllegalMonitorStateException 극복
Java에서 대기 및 알림을 구현하려고 시도하는 동안 파악하기 어려운 IllegalMonitorStateException이 발생했습니다. 이 오류는 현재 스레드가 호출되는 개체와 연결된 모니터를 소유하지 않음을 나타냅니다.
대기 및 알림의 소유권 이해
Javadocs에 명시된 대로 wait()의 경우 스레드는 해당 개체에 대해 wait()를 실행하기 전에 해당 개체의 모니터를 소유해야 합니다. 마찬가지로, inform() 및 informAll() 작업에도 모니터를 소유하려면 호출 스레드가 필요합니다.
Runner 클래스에 동기화 적용
IllegalMonitorStateException을 해결하려면 wait()를 실행하기 전에 현재 스레드가 Main 개체의 모니터를 소유하고 있는지 확인해야 합니다. 다음과 같이 Runner 클래스의 run() 메서드를 동기화하여 이를 달성할 수 있습니다.
<code class="java">class Runner implements Runnable { public void run() { try { synchronized (Main.main) { Main.main.wait(); } } catch (InterruptedException e) { } System.out.println("Runner away!"); } }</code>
Main.main에서 동기화하면 실행 전에 현재 스레드가 Main 개체의 모니터를 획득하도록 할 수 있습니다. 기다리다(). 이를 통해 IllegalMonitorStateException이 발생하지 않고 알림을 성공적으로 기다릴 수 있습니다.
스레드 소유권에 대한 참고 사항
Java에서 스레드는 동기화된 실행 시 개체 모니터의 소유권을 획득합니다. 해당 객체의 블록 또는 동기화된 메서드. 실행이 동기화된 블록이나 메소드를 벗어날 때 소유권을 해제합니다.
위 내용은 Java의 Wait and Notify를 사용할 때 IllegalMonitorStateException이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!