java阻塞佇列實現原理及例項解析
阿新 • • 發佈:2020-01-07
這篇文章主要介紹了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的執行緒必須持有物件的鎖。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。