Java阻塞隊列的實現


Java阻塞隊列的實現

阻塞隊列與普通隊列的不同在於。當隊列是空的時候,從隊列中獲取元素的操作將會被阻塞,或者當隊列滿時,往隊列里面添加元素將會被阻塞。試圖從空的阻塞隊列中獲取元素的線程將會被阻塞,直到其他的線程往空的隊列插入新的元素。同樣,試圖往已滿的阻塞隊列中添加新元素的線程同樣也會被阻塞,直到其他的線程使隊列重新變得空閑起來,如從隊列中移除一個或者多個元素,或者完全清空隊列,下圖展示了如何通過阻塞隊列來合作:

線程1往阻塞隊列中添加元素,而線程2從阻塞隊列中移除元素

從5.0開始,JDK在Java.util.concurrent包里提供了阻塞隊列的官方實現。盡管JDK中已經包含了阻塞隊列的官方實現。

阻塞隊列的實現

阻塞隊列的實現類似於帶上限的Semaphore的實現。

廢話不多說:

package com.huojg.test;

import java.util.LinkedList;
import java.util.List;

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方法內部,只有隊列的大小等於上限(limit)或者下限(0)時,才調用notifyAll方法。如果隊列的大小既不等於上限,也不等於下限,任何線程調用enqueue或者dequeue方法時,都不會阻塞,都能夠正常的往隊列中添加或者移除元素。

 

在Java中,對於Lock和Condition可以理解為對傳統的synchronized和wait/notify機制的替代。

wait/notify有個限制,調用wait/notify的線程必須持有對象的鎖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM