>  기사  >  Java  >  Java에서 wait() 및 inform()을 사용할 때 IllegalMonitorStateException이 발생하는 이유는 무엇입니까?

Java에서 wait() 및 inform()을 사용할 때 IllegalMonitorStateException이 발생하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-31 23:14:29458검색

Why am I getting an IllegalMonitorStateException when using wait() and notify() in Java?

Java 대기 및 알림의 IllegalMonitorStateException

대기 및 알림 이해

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.