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; } }
작동 방식
참고: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!