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

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

Patricia Arquette
풀어 주다: 2024-12-29 06:12:16
원래의
873명이 탐색했습니다.

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

wait() 및 inform()을 사용하여 차단 대기열 구현

소개

멀티 스레드 프로그래밍에서 wait() 및 inform()은 스레드 동기화에 사용됩니다. 이 문서에서는 wait() 및 inform()을 사용하여 항목을 사용할 수 있거나 공간을 사용할 수 있을 때까지 스레드를 차단할 수 있도록 하는 데이터 구조인 차단 대기열을 구현하는 방법을 설명합니다.

wait( ) 및 통지()

조건 차단:

  • put() 메서드: 대기열에 여유 공간이 있을 때까지 차단합니다.
  • take() 메서드: 사용 가능한 요소가 있을 때까지 차단합니다. queue.

Java 코드:

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(); // notifyAll() for multiple producer/consumer threads
    }

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

        T item = queue.remove();
        notify(); // notifyAll() for multiple producer/consumer threads
        return item;
    }
}
로그인 후 복사

wait() 및 inform() 사용 시 고려 사항

  • 동기화된 코드: 동기화된 메서드 내에서 wait() 및 inform()을 호출하거나 block.
  • While 루프: 가짜 깨우기로 인한 조건을 확인하려면 if 문 대신 while 루프를 사용하세요.

Java 1.5 동시성 라이브러리

Java 1.5에서는 더 높은 수준의 동시성 라이브러리를 도입했습니다. 추상화:

수정된 차단 대기열 구현:

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();
        }
    }
}
로그인 후 복사

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

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