차단 대기열 구현

차단 대기열은Concurrent 패키지 아래의 종류로 Array Blocking Queue와 Linked Blocking Queue를 포함한다. 차단 대기열 중put()과take() 두 가지 방법의 실현은 원본 코드에서 볼 수 있듯이 소비자-생산자 모델로 이루어진다. 다음은 자신이 실제로 구현한 간단한 Array Blocking Queue이다.
쓸데없는 말은 작작 하고 코드에 바로 올라가라.

class MyBlockingQueue {  
 
     //         
       
    private static final int DEFAULT_CAPACITY = 128;  
  
    //             
    private E[] queue;  
  
    //          
    private int capacity;  
  
    //           
    private int size;  
  
    //        
    private int head;  
  
    //        
    private int tail;  
  
    //     
    private Lock lock = new ReentrantLock();  
  
       
    private Condition notFull = lock.newCondition();  
  
    
    private Condition notEmpty = lock.newCondition();  
  
    public MyBlockingQueue() {  
        this(DEFAULT_CAPACITY);  
    }  
  
    public MyBlockingQueue(int capacity) {  
        this.capacity = capacity;  
        queue = (E[]) new Object[capacity];  
    }  
  
    
   //          ,      ,       

    public void put(E element) throws InterruptedException {  
        lock.lock();  
        try {  
            while (size >= capacity) {  
                notFull.await();  
            }  
            queue[tail] = element;  
            if (++tail == capacity) {  
                tail = 0;  
            }  
            ++size;  
            notEmpty.signal();  
  
        } finally {  
            lock.unlock();  
        }  
    }  
  
   //         ,      ,      ,           
    
    public E take() throws InterruptedException {  
        lock.lock();  
        try {  
            while (size == 0) {  
                notEmpty.await();  
            }  
            E value = queue[head];  
            queue[head] = null;  
            if (++head == capacity) {  
                head = 0;  
            }  
            --size;  
            notFull.signal();  
            return value;  
        } finally {  
            lock.unlock();  
        }  
    }  
} 

실현된 기능은 비교적 간단하고put()와take() 두 가지 방법만 실현했기 때문에 진정한 차단 대기열은 당연히 복잡하게 맞아야 한다. 그러나 이 두 가지 방법은 차단 대기열이 다른 대기열과 구별되는 두 가지 가장 핵심적인 방법이어야 한다...

좋은 웹페이지 즐겨찾기