概述
除了支持在检索元素时等待队列变为非空和在存储元素时等待空间可用的操作的 Queue 之外,还支持阻塞队列方法。在四种形式中,使用不同的方法处理无法立即满足的操作,但在将来的某个时刻可能会满足:一种抛出异常,第二种返回特殊值(null 或 false,取决于操作),第三种在操作能够成功之前无限期地阻塞当前线程,第四种在放弃之前仅阻塞给定的最大时间限制。这些方法在以下表中总结:
BlockingQueue 实现不接受空元素。尝试添加、放置或提供 null 时,实现会抛出 NullPointerException。null 用作标志值来指示 poll 操作的失败。 BlockingQueue 可能具有容量限制。在任何给定时间内,它都可能有超出哪些没有额外元素可以在不阻塞的情况下放入的 remainingCapacity。没有任何内在容量约束的 BlockingQueue 总是报告 remaining capacity 为 Integer.MAX_VALUE。
BlockingQueue 实现是设计用于生产者 - 消费者队列的,但它们还支持 Collection 接口。因此,例如,可以使用 remove(x) 从队列中删除任意元素。但是,这样的操作通常并不能很高效地执行,并且仅计划在偶尔使用时使用,例如在取消排队的消息时。BlockingQueue 实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。但是,除非在实现中另有说明,否则批量 Collection 操作 addAll、containsAll、retainAll 和 removeAll 不一定是原子执行的。因此,例如,addAll(c) 在添加 c 中的一些元素之后可能失败(抛出异常)。
BlockingQueue 是一种队列,同时支持在取出元素时等待队列变为非空,以及在存储元素时等待空间可用的操作。BlockingQueue 方法有四种形式,用于处理无法立即满足但可能在将来某个时刻满足的操作:一种会抛出异常,第二种会返回一个特殊值(要么是 null,要么是 false,取决于操作),第三种会使当前线程无限期地阻塞,直到操作能够成功,第四种在放弃之前会在给定的最大时间限制内阻塞当前线程。
内存一致性效应:与其他并发集合一样,在将对象放入 BlockingQueue 之前的线程操作先于在另一个线程中从 BlockingQueue 访问或删除该元素之后的操作发生。
方法解析

add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞
drainTo 把此队列中的所有可用元素删除并添加到给定集合中。此操作可能比多次轮询此队列更有效。尝试将元素添加到集合c中时遇到故障可能会导致在抛出相关异常时在这两个集合中的元素均不存在,仅存在一个或两个。尝试将队列排空到自身会导致 IllegalArgumentException。此外,如果在此操作进行时指定的集合被修改,则此操作的行为是未定义的。
分享到: