6.블로킹 큐
자바에서는 java.util.concurrent 패키지를 통해 동기화 기법이 적용된 내장 클래스인 BlockingQueue를 제공함
해당 인터페이스는 스레드 안전한 클래스(Thread safety)로 설계되었으며,
따라서 개발자는 wait, notify()를 통해 직접 스레드를 관리하지 않아도 생산자, 소비자 패턴이 적용된 프로그램을 간단하게 구현할 수 있음
1. put(E e)
큐에 데이터를 적재하기 위해 활용할 수 있는 메서드
만약 큐가 가득 찼을 경우, 호출하는 스레드를 차단함
BlockingQueue.java
// ...
public void put(E e) throws InterruptedException {
putLast(e);
}
public void putLast(E e) throws InterruptedException {
if (e == null) throw new NullPointerException();
Node<E> node = new Node<E>(e);
final ReentrantLock lock = this.lock;
lock.lock();
try {
while (!linkLast(node))
notFull.await();
} finally {
lock.unlock();
}
}2. take()
큐에서 데이터를 소비하기 위해 활용할 수 있는 메서드
만약 큐가 비어있을 경우, 호출하는 스레드를 차단함
BlockingQueue.java
// ...
public E take() throws InterruptedException {
return takeFirst();
}
public E takeFirst() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lock();
try {
E x;
while ( (x = unlinkFirst()) == null)
notEmpty.await();
return x;
} finally {
lock.unlock();
}
}Last updated on