Java阻塞隊列的實現
阻 塞隊列與普通隊列的區別在于,當隊列是空的時,從隊列中獲取元素的操作將會被阻塞,或者當隊列是滿時,往隊列里添加元素的操作會被阻塞。試圖從空的阻塞隊 列中獲取元素的線程將會被阻塞,直到其他的線程往空的隊列插入新的元素。同樣,試圖往已滿的阻塞隊列中添加新元素的線程同樣也會被阻塞,直到其他的線程使 隊列重新變得空閑起來,如從隊列中移除一個或者多個元素,或者完全清空隊列,下圖展示了如何通過阻塞隊列來合作:
線程1往阻塞隊列中添加元素,而線程2從阻塞隊列中移除元素
從5.0開始,JDK在java.util.concurrent包里提供了阻塞隊列的官方實現。盡管JDK中已經包含了阻塞隊列的官方實現,但是熟悉其背后的原理還是很有幫助的。
阻塞隊列的實現
阻塞隊列的實現類似于帶上限的Semaphore的實現。下面是阻塞隊列的一個簡單實現
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);
}
}
|
</div>
</div>
必 須注意到,在enqueue和dequeue方法內部,只有隊列的大小等于上限(limit)或者下限(0)時,才調用notifyAll方法。如果隊列 的大小既不等于上限,也不等于下限,任何線程調用enqueue或者dequeue方法時,都不會阻塞,都能夠正常的往隊列中添加或者移除元素。
來自:http://my.oschina.net/u/729210/blog/277261
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!