執行緒通訊 阻塞佇列

2021-07-29 18:20:04 字數 1795 閱讀 1155

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 維護的是定長陣列,初始化的時候...