본문 바로가기

Java

블로킹 큐(Blocking Queue)

Blocking Queue

멀티 쓰레드 환경에서 사용되는 자료구조로,

큐의 상태에 따라 자원의 생성과 소비를 제어할 수 있는 큐입니다.

멀티쓰레드 환경에서 쓰레드를 대기시킬 때 주로 사용됩니다(Producer-Consumer 패턴).

스크린샷 2020-08-22 오전 12 14 43

Blocking Queue는 자원의 생성과 소비를 담당하는 각각의 메서드로 PutTake를 사용합니다.

Blocking Queue는 자원의 생성과 소비 과정에서 큐가 가득 차 있거나, 비어 있을 경우의 예외를 방지하기 위해 각각의 상황에서 큐를 블로킹합니다. 다음은 Blocking Queue의 구현체 중 하나인 ArrayBlockingQueueputtake 메서드입니다.

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클래스의 인스턴스인 notFullnotEmpty 매개변수를 통해

큐가 가득 차 있거나, 비어있을 경우에 대해 대기시키는 것을 확인할 수 있습니다.

'Java' 카테고리의 다른 글

Atomic Type  (0) 2020.08.22