대기 및 알림 이해
wait() 및 inform() 메서드 Object 클래스는 Java의 스레드 간 통신에 사용됩니다. wait()는 다른 스레드가 동일한 객체에 대해 inform()을 호출할 때까지 호출 스레드를 기다리게 하고 스레드를 해제하여 실행을 계속합니다.
IllegalMonitorStateException
IllegalMonitorStateException은 다음과 같습니다. 스레드가 고유 잠금을 유지하지 않고 객체를 기다리려고 할 때 발생합니다. 이 잠금은 동기화된 블록 또는 메소드를 사용하여 객체를 동기화함으로써 획득됩니다.
제공된 코드에서
wait() 메소드가 제공되었기 때문에 제공한 코드에서 이 예외가 발생합니다. 해당 개체에 대한 동기화 없이 호출됩니다. Runner 클래스에서는 run() 메서드 내에서 wait() 메서드가 호출됩니다. 그러나 run() 메소드는 어떤 객체에서도 동기화되지 않습니다.
해결 방법
이 문제를 해결하려면 Main.main에서 run() 메소드를 동기화해야 합니다. wait()가 호출되는 객체입니다. 이렇게 하면 현재 스레드가 대기를 시도하기 전에 Main.main에 대한 고유 잠금을 보유하게 됩니다.
<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>
이 동기화는 현재 스레드가 wait()를 호출하기 전에 Main.main에 대한 고유 잠금을 획득하도록 보장하여 IllegalMonitorStateException이 발생하지 않습니다.
위 내용은 Java에서 wait() 및 inform()을 사용할 때 IllegalMonitorStateException이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!