> Java > java지도 시간 > 본문

Java의 Wait and Notify를 사용할 때 IllegalMonitorStateException이 발생하는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-30 19:39:03
원래의
800명이 탐색했습니다.

Why Am I Getting an IllegalMonitorStateException When Using Java's Wait and Notify?

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿