针对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 对象,并根据使用者获取这些对象的时间来对它们进行解释。

相关文章
相关标签/搜索