> Java > java지도 시간 > 차단 대기열을 구현하기 위해 Java의 `wait()` 및 `notify()` 메서드를 어떻게 사용할 수 있습니까?

차단 대기열을 구현하기 위해 Java의 `wait()` 및 `notify()` 메서드를 어떻게 사용할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-11-23 09:42:31
원래의
720명이 탐색했습니다.

How Can Java's `wait()` and `notify()` Methods Be Used to Implement a Blocking Queue?

Java에서 Wait() 및 Notify() 사용: 대기열이 있는 시나리오

질문:

wait() 및 inform() 구현 방법에 대한 포괄적인 연습을 제공할 수 있습니까? Queue가 있는 메소드가 있습니까?

답변:

Wait() 및 Notify()의 원리

Wait() 및 통지()는 스레드가 진행하기 전에 특정 조건이 충족될 때까지 기다리도록 하여 스레드 조정을 활성화합니다. 이 경우 용량 제한을 적용하는 차단 대기열을 만드는 데 관심이 있습니다.

구현

public class BlockingQueue<T> {

    private Queue<T> queue = new LinkedList<>();
    private int capacity;

    public BlockingQueue(int capacity) {
        this.capacity = capacity;
    }

    public synchronized void put(T element) throws InterruptedException {
        while (queue.size() == capacity) {
            wait();
        }

        queue.add(element);
        notify(); // Notify waiting threads
    }

    public synchronized T take() throws InterruptedException {
        while (queue.isEmpty()) {
            wait();
        }

        T item = queue.remove();
        notify(); // Notify waiting threads
        return item;
    }
}
로그인 후 복사

작동 방식

  • Put() 메서드: 대기열이 가득 차면 현재 스레드는 공간이 사용 가능하다는 알림을 받을 때까지 기다립니다.
  • Take() 메서드: 대기열이 비어 있으면 현재 스레드는 공간이 사용 가능하다는 알림을 받을 때까지 기다립니다. 요소를 사용할 수 있다는 알림.

참고: wait() 및 inform() 호출이 동일한 객체에 동기화되고 while 루프 내에 배치되어 가짜 깨우기를 처리합니다.

Java 1.5 동시 기능

Java 1.5에서는 java.util.concurrent 패키지를 도입했습니다. , 스레드 조정을 위한 더 높은 수준의 추상화를 제공합니다. 다음은 예제의 업데이트된 버전입니다.

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class BlockingQueue<T> {

    private Queue<T> queue = new LinkedList<>();
    private int capacity;
    private Lock lock = new ReentrantLock();
    private Condition notFull = lock.newCondition();
    private Condition notEmpty = lock.newCondition();

    public BlockingQueue(int capacity) {
        this.capacity = capacity;
    }

    public void put(T element) throws InterruptedException {
        lock.lock();
        try {
            while (queue.size() == capacity) {
                notFull.await();
            }

            queue.add(element);
            notEmpty.signal();
        } finally {
            lock.unlock();
        }
    }

    public T take() throws InterruptedException {
        lock.lock();
        try {
            while (queue.isEmpty()) {
                notEmpty.await();
            }

            T item = queue.remove();
            notFull.signal();
            return item;
        } finally {
            lock.unlock();
        }
    }
}
로그인 후 복사

이 접근 방식은 향상된 스레드 조정을 위해 잠금 및 조건을 사용합니다.

BlockingQueue 인터페이스 고려

차단 대기열이 필요한 경우 스레드 안전 및 용량 제어 기능을 갖춘 표준 구현을 제공하는 Java BlockingQueue 인터페이스 구현을 사용하는 것이 좋습니다. 운영합니다.

위 내용은 차단 대기열을 구현하기 위해 Java의 `wait()` 및 `notify()` 메서드를 어떻게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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