인생을 코딩하다.

[Java]블로킹 큐(Blocking Queues) 본문

Java

[Java]블로킹 큐(Blocking Queues)

Hyung1 2021. 3. 28. 01:16
728x90
반응형

블로킹 큐(Blocking Queues)

특정 상황에 쓰레드를 대기하도록 하는 큐이다.

 

큐에서 element를 빼려고 시도했는데(디큐) 큐가 비어있다거나, 큐에 엘레멘트를 넣으려 했는데(인큐) 큐에 넣을 수 있는 공간이 없다거나 할 때 디큐/인큐 호출 쓰레드를 대기하도록 한다.

 

비어있는 큐에서 엘레멘트를 빼려고 시도하는 쓰레드의 대기 상태는 다른 쓰레드가 이 큐에 element를 넣을 때까지 지속된다. 꽉 찬 큐에 element를 넣으려 시도하는 쓰레드의 대기 상태는 다른 쓰레드가 큐에서 element를 빼거나 큐를 정리하여(clean) 큐의 공간이 확보될 때까지 지속된다. 

 

블로킹 큐는 put과 take라는 핵심 메소드를 갖고 있고, 더불어 offer와 poll이라는 메소드도 갖고 있다.
만약 큐가 가득차 있다면 put메소드는 값을 추가할 공간이 생길 때까지 대기한다.
만약 큐가 비어있다면 take메소드는 값이 들어올 떄까지 대기한다.

 

아래는 한 블로킹 큐를 둔 두 쓰레드의 상호 동작을 보여준다.

블로킹 큐(Blocking Queues) 구현

다음은 블록킹 큐의 간단한 구현이다.

 

public class BlockingQueue {

  private List queue = new LinkedList();
  private int  limit = 10;

  public BlockingQueue(int limit){
    this.limit = limit;
  }


  public synchronized void enqueue(Object item)
  throws InterruptedException  {
    while(this.queue.size() == this.limit) {
      wait();
    }
    if(this.queue.size() == 0) {
      notifyAll();
    }
    this.queue.add(item);
  }


  public synchronized Object dequeue()
  throws InterruptedException{
    while(this.queue.size() == 0){
      wait();
    }
    if(this.queue.size() == this.limit){
      notifyAll();
    }

    return this.queue.remove(0);
  }

}
    

큐 크기가 크기 제한에 다다르면 enqueue() 와 dequeue() 에서 notifyAll() 이 호출된다. 큐 크기가 제한에 다다르지 않은 상태로 enqueue() 나 dequeue() 가 호출되면 쓰레드는 대기하지 않는다.

 

출처: 

https://hooneyo.tistory.com/entry/블로킹큐 [Hooney의 스토리텔링]

728x90
반응형
Comments