Blocking Queue
멀티 쓰레드 환경에서 사용되는 자료구조로,
큐의 상태에 따라 자원의 생성과 소비를 제어할 수 있는 큐입니다.
멀티쓰레드 환경에서 쓰레드를 대기시킬 때 주로 사용됩니다(Producer-Consumer 패턴).
Blocking Queue는 자원의 생성과 소비를 담당하는 각각의 메서드로 Put
과 Take
를 사용합니다.
Blocking Queue는 자원의 생성과 소비 과정에서 큐가 가득 차 있거나, 비어 있을 경우의 예외를 방지하기 위해 각각의 상황에서 큐를 블로킹합니다. 다음은 Blocking Queue
의 구현체 중 하나인 ArrayBlockingQueue
의 put
과 take
메서드입니다.
public void put(E e) throws InterruptedException {
checkNotNull(e);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == items.length)
notFull.await();
enqueue(e);
} finally {
lock.unlock();
}
}
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == 0)
notEmpty.await();
return dequeue();
} finally {
lock.unlock();
}
}
작업 전에 ReentrantLock
을 통해 동시성을 보장하고,
try
구문 안을 보면 각각의 경우에 대해 Condition
클래스의 인스턴스인 notFull
과 notEmpty
매개변수를 통해
큐가 가득 차 있거나, 비어있을 경우에 대해 대기시키는 것을 확인할 수 있습니다.
'Java' 카테고리의 다른 글
Atomic Type (0) | 2020.08.22 |
---|