1、blockingqueue( 阻塞佇列):
當生產者試圖向blockingqueue中放入元素時,如果該佇列已滿,則該執行緒被阻塞,當消費者試圖從佇列中取出元素,當隊列為空時阻塞。
主要方法:
(1)法向blockingqueue中插入null,否則丟擲nullpointerexception
(2)不僅可以操作對頭和隊尾元素,也可以是中間的,比如remove()中間某個元素,但這樣做的效率不高,因為是基於佇列的資料結構
3、實現類
4、應用:阻塞佇列最常用的場景就是
生產者消費者模式,也是各種生產者消費者模式方式中首選的方式。
public class run
public void run()catch(interruptedexception e)
}}
public void shutdown()
/***
* @title: consumer
* @description: 消費者執行緒*/}
public static class consumer implements runnable
public void run()catch(interruptedexception e)
}} public void shutdown()
} public static void main(string args) throws interruptedexception
trycatch(interruptedexception e)
} producer.shutdown();
consumer.shutdown();
}}
5、阻塞佇列原理:利用
lock的多condition阻塞控制,blockingqueue封裝了根據條件阻塞執行緒的過程
(1)jdk8 arrayblockingqueue中的部分原始碼,定義了乙個reentrantlock和多個condition
/** main lock guarding all access */
final reentrantlock lock;
/** condition for waiting takes */
private final condition notempty;
/** condition for waiting puts */
private final condition notfull;
(2)構造方法
public arrayblockingqueue(int capacity, boolean fair)
(3)put
public void put(e e) throws interruptedexception finally
}
(4)take
public e take() throws interruptedexception finally
}
(5)linkedblockingqueue
public linkedblockingdeque(collection extends e> c)
} finally
}
多執行緒 阻塞佇列
blockingqueue最終會有四種狀況,丟擲異常 返回特殊值 阻塞 超時,下表總結了這些方法 丟擲異常 特殊值阻塞 超時插入add e offer e put e offer e,time,unit 移除remove poll take poll time,unit 檢查element peek...
多執行緒 阻塞佇列
1 當佇列滿的時候,插入元素的執行緒被阻塞,直達佇列不滿。2 隊列為空的時候,獲取元素的執行緒被阻塞,直到佇列不空。生產者就是生產資料的執行緒,消費者就是消費資料的執行緒。在多執行緒開發中,如果生產者處理速度很快,而消費者處理速度很慢,那麼生產者就必須等待消費者處理完,才能繼續生產資料。同樣的道理,...
執行緒安全的佇列 阻塞佇列
queue佇列 先進先出,兩個執行緒同時操作同乙個佇列,執行緒是不安全的 blockingqueue阻塞佇列 先進先出,執行緒是安全,阻塞佇列中維護了鎖,用於進出佇列。一般阻塞佇列用於生產者和消費者模式。arrayblockingqueue 1 基於陣列的阻塞佇列。2 維護的是定長陣列,初始化的時候...