国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

《java.util.concurrent 包源碼閱讀》05 BlockingQueue

2019-11-14 20:48:58
字體:
來源:轉載
供稿:網友
java.util.concurrent 包源碼閱讀》05 BlockingQueue

想必大家都很熟悉生產者-消費者隊列,生產者負責添加元素到隊列,如果隊列已滿則會進入阻塞狀態直到有消費者拿走元素。相反,消費者負責從隊列中拿走元素,如果隊列為空則會進入阻塞狀態直到有生產者添加元素到隊列。BlockingQueue就是這么一個生產者-消費者隊列。

BlockingQueue是Queue的子接口

public interface BlockingQueue<E> extends Queue<E>

BlockingQueue拿走元素時,如果隊列為空,阻塞等待會有兩種情況:

一種是一直等待直到隊列不為空,這種情況調用take方法

E take() throws InterruptedException;

另一種就是設定一個超時時間,一直等到超時,這種情況調用的是pool方法

E poll(long timeout, TimeUnit unit) throws InterruptedException;

同樣對于添加元素來說,也有兩種情況:

一直等待使用put方法

void put(E e) throws InterruptedException;

超時等待使用offer方法

boolean offer(E e, long timeout, TimeUnit unit)        throws InterruptedException;

BlockingQueue的父接口Queue關于拿走元素的接口有兩個:remove和pool。

兩者的區別在于當隊列為空時前者會拋出NoSuchElementException,而后者返回null。

E remove();E poll();

添加元素的接口也有兩個:add和offer。兩者的區別在于當隊列為滿時前者會拋出IllegalStateException,而后者返回false。

boolean add(E e);boolean offer(E e);

一般來說Queue類型的數據結構會有兩種實現:數組和鏈表。對應到BlockingQueue就是ArrayBlockingQueue和LinkedBlockingQueue,兩者都是基于AbstractQueue實現的。

public class ArrayBlockingQueue<E> extends AbstractQueue<E>        implements BlockingQueue<E>, java.io.Serializable
public class LinkedBlockingQueue<E> extends AbstractQueue<E>        implements BlockingQueue<E>, java.io.Serializable

這里很有必要說說AbstractQueue,AbstractQueue只是實現了add和remove方法,而且很有意思的是這兩個方法都是借助他們對應的無異常版本的方法offer和pool來實現的。

    public boolean add(E e) {        if (offer(e))            return true;        else            throw new IllegalStateException("Queue full");    }
    public E remove() {        E x = poll();        if (x != null)            return x;        else            throw new NoSuchElementException();    }

這樣做的好處無疑是提供了良好的擴展性,也就是把真正添加/拿走元素的實現留給子類來完成(可以實現線程安全和非線程安全兩個版本)。

研究BlockingQueue關注的重點就是Blocking是如果實現的,接下來的兩篇文章將會詳細分析ArrayBlockingQueue和LinkedBlockingQueue如何實現線程的Blocking。


上一篇:Java語言基礎

下一篇:Java IO操作

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 呈贡县| 酒泉市| 铜山县| 叶城县| 靖安县| 叙永县| 滕州市| 内丘县| 陇西县| 梁河县| 黄梅县| 鄢陵县| 台前县| 长沙县| 奉贤区| 永定县| 西盟| 布尔津县| 台东市| 大石桥市| 城步| 汝州市| 天祝| 阳山县| 东辽县| 云安县| 高碑店市| 东阿县| 航空| 芦溪县| 宜都市| 乐都县| 东阿县| 绥化市| 巴彦县| 板桥市| 宜城市| 英吉沙县| 麻江县| 桦甸市| 阿拉善盟|