>  기사  >  Java  >  Java의 객체 메소드에 대한 심층 분석: 대기 및 알림

Java의 객체 메소드에 대한 심층 분석: 대기 및 알림

PHPz
PHPz원래의
2023-12-20 12:47:38469검색

Java의 객체 메소드에 대한 심층 분석: 대기 및 알림

Java의 객체 메소드: wait 및 inform에 대한 자세한 설명

Java에서 wait 및 inform 객체 메소드는 스레드 간 협업 및 통신을 위한 중요한 도구입니다. 이는 스레드가 적시에 다른 스레드의 실행을 기다리거나 깨울 수 있도록 도와줍니다. 이 기사에서는 대기 및 알림 메소드의 사용을 자세히 소개하고 특정 코드 예제를 제공합니다.

1. 대기 메소드 사용

대기 메소드는 다른 스레드가 동일한 객체에 대해 알림 메소드를 호출하거나 informAll 메소드가 깨어날 때까지 현재 스레드를 대기 상태로 두는 데 사용됩니다. wait 메서드의 형식은 다음과 같습니다.

  1. void wait(): 다른 스레드가 깨어날 때까지 현재 스레드를 기다리게 합니다.
  2. void wait(long timeout): 현재 스레드가 지정된 밀리초 동안 기다리거나 다른 스레드가 깨어날 때까지 기다리게 합니다.
  3. void wait(long timeout, int nanos): 현재 스레드가 지정된 밀리초 수에 지정된 나노초 수를 더한 기간 동안 기다리거나 다른 스레드가 깨어날 때까지 기다리게 합니다.

wait 메소드를 사용하는 경우 객체 잠금을 보장하기 위해 동기화된 코드 블록에 포함되어야 합니다. 다음은 전형적인 예입니다.

public class WaitNotifyExample {
    private boolean flag = false;
    
    public synchronized void waitForFlag() {
        try {
            while (!flag) {
                wait(); // 当前线程等待
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 执行其他操作
    }
    
    public synchronized void setFlag() {
        flag = true;
        notify(); // 唤醒正在等待的线程
    }
}

위의 예에서 waitForFlag 메서드를 호출한 후 스레드는 다른 스레드가 setFlag 메서드를 호출하여 깨울 때까지 대기 상태로 들어갑니다.

2. 알림 메소드 사용

알림 메소드는 대기 중인 스레드를 깨우는 데 사용됩니다. 깨울 스레드를 무작위로 선택합니다. 대기 중인 스레드가 여러 개인 경우 그 중 하나만 깨울 수 있습니다. 통지 메소드는 다음과 같은 형태로 사용됩니다.

public class NotifyExample {
    public synchronized void waitForNotify() {
        try {
            wait(); // 当前线程等待
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 执行其他操作
    }
    
    public synchronized void notifyThread() {
        notify(); // 唤醒一个等待的线程
    }
}

위의 예에서 waitForNotify 메소드를 호출하는 스레드는 다른 스레드가 통지 스레드 메소드를 호출하여 깨어날 때까지 대기 상태에 들어갑니다.

3. 대기 및 알림을 사용하여 스레드 간 협업 달성

대기 및 알림 방법은 생산자-소비자 모델과 같은 다중 스레드 공동 작업 시나리오에서 자주 사용됩니다. 다음은 간단한 생산자-소비자 예입니다.

public class ProducerConsumerExample {
    private LinkedList<Integer> buffer = new LinkedList<>();
    private final int MAX_SIZE = 10;
    
    public synchronized void produce() {
        while (buffer.size() == MAX_SIZE) {
            try {
                wait(); // 缓冲区已满,生产者线程等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        buffer.add(1);
        notifyAll(); // 唤醒等待的消费者线程
    }
    
    public synchronized void consume() {
        while (buffer.size() == 0) {
            try {
                wait(); // 缓冲区为空,消费者线程等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        buffer.removeFirst();
        notifyAll(); // 唤醒等待的生产者线程
    }
}

위의 예에서 버퍼가 가득 차면 생산자 스레드는 소비자 스레드가 버퍼의 요소를 소비하고 생산 또는 스레드를 깨울 때까지 대기 상태에 들어갑니다. 버퍼가 비어 있으면 소비자 스레드는 생산자 스레드가 새 요소를 생성하고 소비자 스레드를 깨울 때까지 대기 상태에 들어갑니다.

요약: 대기 및 알림 메소드는 Java의 스레드 협업 및 통신을 위한 중요한 도구입니다. 이는 멀티스레드 프로그래밍에서 중요한 역할을 합니다. 대기 및 알림 방법을 합리적으로 사용하면 스레드 간의 우아한 협업 및 통신이 달성될 수 있습니다.

위 내용은 Java의 객체 메소드에 대한 심층 분석: 대기 및 알림의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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