針對Java多線程對BlockingQueue深刻分析解析

1、概述:安全

  BlockingQueue做爲線程容器,能夠爲線程同步提供有力的保障。併發

  2、BlockingQueue定義的經常使用方法ide

  1.BlockingQueue定義的經常使用方法以下:線程

  拋出異常 特殊值 阻塞 超時對象

  插入 add(e) offer(e) put(e) offer(e, time, unit)接口

  移除 remove() poll() take() poll(time, unit)隊列

  檢查 element() peek() 不可用 不可用ci

  1)add(anObject):把anObject加到BlockingQueue裏,即若是BlockingQueue能夠容納,則返回true,不然招聘異常element

  2)offer(anObject):表示若是可能的話,將anObject加到BlockingQueue裏,即若是BlockingQueue能夠容納,則返回true,不然返回false.rem

  3)put(anObject):把anObject加到BlockingQueue裏,若是BlockQueue沒有空間,則調用此方法的線程被阻斷直到BlockingQueue裏面有空間再繼續。

  4)poll(time):取走BlockingQueue裏排在首位的對象,若不能當即取出,則能夠等time參數規定的時間,取不到時返回null

  5)take():取走BlockingQueue裏排在首位的對象,若BlockingQueue爲空,阻斷進入等待狀態直到Blocking有新的對象被加入爲止

  其中:BlockingQueue 不接受null 元素。試圖add、put 或offer 一個null 元素時,某些實現會拋出NullPointerException.null 被用做指示poll 操做失敗的警惕值。

  3、BlockingQueue的幾個注意點

  【1】BlockingQueue 能夠是限定容量的。它在任意給定時間均可以有一個remainingCapacity,超出此容量,便沒法無阻塞地put 附加元素。沒有任何內部容量約束的BlockingQueue 老是報告Integer.MAX_VALUE 的剩餘容量。

  【2】BlockingQueue 實現主要用於生產者-使用者隊列,但它另外還支持Collection 接口。所以,舉例來講,使用remove(x) 從隊列中移除任意一個元素是有可能的。然而,這種操做一般不 會有效執行,只能有計劃地偶爾使用,好比在取消排隊信息時。

  【3】BlockingQueue 實現是線程安全的。全部排隊方法均可以使用內部鎖或其餘形式的併發控制來自動達到它們的目的。然而,大量的 Collection 操做(addAll、containsAll、retainAll 和removeAll)沒有 必要自動執行,除非在實現中特別說明。所以,舉例來講,在只添加了c 中的一些元素後,addAll(c) 有可能失敗(拋出一個異常)。

  【4】BlockingQueue 實質上不 支持使用任何一種"close"或"shutdown"操做來指示再也不添加任何項。這種功能的需求和使用有依賴於實現的傾向。例如,一種經常使用的策略是:對於生產者,插入特殊的end-of-stream 或poison 對象,並根據使用者獲取這些對象的時間來對它們進行解釋。

相關文章
相關標籤/搜索