>  기사  >  Java  >  Java의 객체 메소드 대기 및 알림의 기능과 응용을 학습합니다.

Java의 객체 메소드 대기 및 알림의 기능과 응용을 학습합니다.

WBOY
WBOY원래의
2023-12-20 11:39:29895검색

Java의 객체 메소드 대기 및 알림의 기능과 응용을 학습합니다.

Java의 개체 메서드 이해: 대기 및 알림의 역할과 사용법

Java에서 개체 메서드는 동시 프로그래밍을 구현하는 데 중요한 도구입니다. 그중에서 wait와 inform은 스레드 대기 및 깨우기 작업을 구현하는 데 일반적으로 사용되는 두 가지 방법입니다. 이 기사에서는 이 두 가지 방법을 자세히 소개하고 몇 가지 구체적인 코드 예제를 제공합니다.

wait 메소드는 Object 클래스에 정의된 메소드로, 다른 스레드가 동일한 객체의 inform 또는 informAll 메소드를 호출하여 깨울 때까지 현재 스레드를 대기 상태로 두는 데 사용됩니다. wait 메소드를 호출하기 전에 스레드는 먼저 객체의 모니터 잠금을 획득해야 합니다. wait 메서드에는 두 가지 오버로드된 형식이 있습니다.

  1. wait(): 다른 스레드가 깨어날 때까지 현재 스레드를 기다리게 합니다.
  2. wait(long timeout): 현재 스레드가 지정된 밀리초 동안 기다리거나 다른 스레드가 깨어날 때까지 기다리게 합니다.

다음은 생산자-소비자 모델을 구현하기 위해 대기 메서드를 사용하는 샘플 코드입니다.

public class ProducerConsumer {
    private final Object lock = new Object();
    private List<String> buffer = new ArrayList<>();
    private int bufferSize = 10;
    
    public void produce() throws InterruptedException {
        synchronized (lock) {
            // 判断缓冲区是否已满
            while (buffer.size() == bufferSize) {
                lock.wait(); // 等待消费者消费
            }
            // 生产物品到缓冲区
            buffer.add("Item");
            System.out.println("生产者生产一个物品,缓冲区大小:" + buffer.size());
            // 唤醒等待的消费者线程
            lock.notifyAll();
        }
    }
    
    public void consume() throws InterruptedException {
        synchronized (lock) {
            // 判断缓冲区是否为空
            while (buffer.isEmpty()) {
                lock.wait(); // 等待生产者生产
            }
            // 从缓冲区消费物品
            String item = buffer.remove(0);
            System.out.println("消费者消费一个物品,缓冲区大小:" + buffer.size());
            // 唤醒等待的生产者线程
            lock.notifyAll();
        }
    }
}

위 코드에서 생산자는 대기 메서드를 사용하여 버퍼가 가득 찰 때까지 대기 상태에 들어갑니다. 소비자 사용 대기 메소드는 소비하기 전에 버퍼가 비어 있지 않을 때까지 대기 상태에 들어갑니다. 생산자가 항목을 생산하거나 소비자가 항목을 소비하면 객체의 informAll 메서드가 호출되어 대기 중인 스레드를 깨웁니다.

notify 메소드는 Object 클래스에 정의된 메소드이기도 하며 동일한 객체를 기다리는 스레드를 깨우는 데 사용됩니다. informAll 메소드와 달리 통지 메소드는 스레드 중 하나만 깨울 수 있습니다. 다음은 알림 메서드 사용 예입니다.

public class ThreadMonitor {
    private final Object lock = new Object();
    
    public void performTask() throws InterruptedException {
        synchronized (lock) {
            System.out.println("线程" + Thread.currentThread().getId() + "开始执行任务");
            lock.wait(); // 等待唤醒
            System.out.println("线程" + Thread.currentThread().getId() + "继续执行任务");
        }
    }
    
    public void wakeUpThread() {
        synchronized (lock) {
            lock.notify(); // 唤醒等待的线程
        }
    }
}

위 코드에서 PerformTask 메서드는 다른 스레드가 wakeUpThread 메서드를 호출하여 깨울 때까지 스레드를 대기 상태로 전환합니다. wakeUpThread 메소드는 알림 메소드를 사용하여 대기 중인 스레드를 깨웁니다.

대기 및 알림 메서드를 사용할 때는 먼저 개체의 모니터 잠금을 얻어야 합니다. 즉, 동기화된 코드 블록이나 동기화된 메서드에서 사용해야 합니다.

요약하자면, 대기 및 알림은 Java에서 스레드 간 통신을 실현하는 데 중요한 방법입니다. 스레드 대기 및 깨우기 작업을 구현할 수 있으며 여러 스레드의 실행 순서와 공유 리소스에 대한 액세스를 조정하는 데 사용됩니다. 이 문서에 제공된 코드 예제는 독자가 이 두 가지 방법의 사용을 더 잘 이해하는 데 도움이 될 수 있습니다. 대기 및 알림 방법을 적절하게 활용함으로써 보다 안전하고 효율적인 멀티스레드 프로그램을 작성할 수 있습니다.

위 내용은 Java의 객체 메소드 대기 및 알림의 기능과 응용을 학습합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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