方法摘要
boolean |
add(E o) 将指定的元素添加到此队列中(如果立即可行),在成功时返回 true,其他情况则抛出 IllegalStateException。 |
int |
drainTo(Collection<? super E> c) 移除此队列中所有可用的元素,并将它们添加到给定 collection 中。 |
int |
drainTo(Collection<? super E> c, int maxElements) 最多从此队列中移除给定数量的可用元素,并将这些元素添加到给定 collection 中。 |
boolean |
offer(E o) 如果可能的话,将指定元素插入此队列中。 |
boolean |
offer(E o, long timeout, TimeUnit unit) 将指定的元素插入此队列中,如果没有可用空间,将等待指定的等待时间(如果有必要)。 |
E |
poll(long timeout, TimeUnit unit) 检索并移除此队列的头部,如果此队列中没有任何元素,则等待指定等待的时间(如果有必要)。 |
void |
put(E o) 将指定元素添加到此队列中,如果没有可用空间,将一直等待(如果有必要)。 |
int |
remainingCapacity() 返回在无阻塞的理想情况下(不存在内存或资源约束)此队列能接受的元素数量;如果没有内部限制,则返回 Integer.MAX_VALUE。 |
E |
take() 检索并移除此队列的头部,如果此队列不存在任何元素,则一直等待。 |
从接口 java.util.Collection 继承的方法
addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll,retainAll, size, toArray, toArray |
http://blog.csdn.net/simpkan/archive/2010/12/21/6090432.aspx
支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用。
BlockingQueue 添加元素方法3种,对于不能立即满足但可能在将来某一时刻可以满足的操作,这四种形式的处理方式不同:
- add(e):第1种是抛出一个异常
- offer(e):第2种是在操作可以成功前,无限期地阻塞当前线程,
- offer(e,timeout):第3种是在放弃前只在给定的最大时间限制内阻塞。
BlockingQueue 不接受 null 元素。试图 add、put 或 offer 一个 null 元素时,某些实现会抛出 NullPointerException。null 被用作指示 poll 操作失败的警戒值。
BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个 remainingCapacity,超出此容量,便无法无阻塞地 put 附加元素。没有任何内部容量约束的 BlockingQueue 总是报告 Integer.MAX_VALUE 的剩余容量。
BlockingQueue 实现主要用于生产者-使用者队列,但它另外还支持 Collection 接口。因此,举例来说,使用 remove(x) 从队列中移除任意一个元素是有可能的。然而,这种操作通常不 会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。
BlockingQueue 实现是线程安全的。所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。然而,大量的 Collection 操作(addAll、containsAll、retainAll 和 removeAll)没有 必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了 c 中的一些元素后,addAll(c) 有可能失败(抛出一个异常)。
BlockingQueue 实质上不 支持使用任何一种“close”或“shutdown”操作来指示不再添加任何项。这种功能的需求和使用有依赖于实现的倾向。例如,一种常用的策略是:对于生产者,插入特殊的 end-of-stream 或 poison 对象,并根据使用者获取这些对象的时间来对它们进行解释。
已知在JDK中的实现包括:
- ArrayBlockingQueue; 一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素。这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。此类支持对等待的生产者线程和使用者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。然而,通过将公平性 (fairness) 设置为 true 而构造的队列允许按照 FIFO 顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”。
- DelayQueue; Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部 是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且 poll 将返回 null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于等于 0 的值时,将发生到期。即使无法使用 take 或 poll 移除未到期的元素,也不会将这些元素作为正常元素对待。例如,size 方法同时返回到期和未到期元素的计数。此队列不允许使用 null 元素。
- LinkedBlockingQueue; 一个基于已链接节点的、范围任意的 blocking queue。此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。可选的容量范围构造方法参数作为防止队列过度扩展的一种方法。如果未指定容量,则它等于 Integer.MAX_VALUE。除非插入节点会使队列超出容量,否则每次插入后会动态地创建链接节点。
- PriorityBlockingQueue; 一个无界阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞获取操作。虽然此队列逻辑上是无界的,但是资源被耗尽时试图执行 add 操作也将失败(导致 OutOfMemoryError)。此类不允许使用 null 元素。依赖自然顺序的优先级队列也不允许插入不可比较的对象(这样做会导致抛出 ClassCastException)。此类及其迭代器可以实现 Collection 和 Iterator 接口的所有可选 方法。iterator() 方法中提供的迭代器并不 保证以特定的顺序遍历 PriorityBlockingQueue 的元素。如果需要有序地进行遍历,则应考虑使用 Arrays.sort(pq.toArray())。此外,可以使用方法 drainTo 按优先级顺序移除 全部或部分元素,并将它们放在另一个 collection 中。在此类上进行的操作不保证具有同等优先级的元素的顺序。如果需要实施某一排序,那么可以定义自定义类或者比较器,比较器可使用修改键断开主优先级值之间的联系。例如,以下是应用先进先出 (first-in-first-out) 规则断开可比较元素之间联系的一个类。要使用该类,则需要插入一个新的 FIFOEntry(anEntry) 来替换普通的条目对象。
- SynchronousQueue;一种阻塞队列,其中每个插入操作必须等待另一个线程的对应移除操作 ,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因为仅在试图要移除元素时,该元素才存在;除非另一个线程试图移除某个元素,否则也不能(使用任何方法)插入元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的头 是尝试添加到队列中的首个已排队插入线程的元素;如果没有这样的已排队线程,则没有可用于移除的元素并且 poll() 将会返回 null。对于其他 Collection 方法(例如 contains),SynchronousQueue 作为一个空 collection。此队列不允许 null 元素。同步队列类似于 CSP 和 Ada 中使用的 rendezvous 信道。它非常适合于传递性设计,在这种设计中,在一个线程中运行的对象要将某些信息、事件或任务传递给在另一个线程中运行的对象,它就必须与该对象同步。对于正在等待的生产者和使用者线程而言,此类支持可选的公平排序策略。默认情况下不保证这种排序。但是,使用公平设置为 true 所构造的队列可保证线程以 FIFO 的顺序进行访问。
分享到:
相关推荐
在IT行业中,多线程定时任务邮件服务是一个常见的需求,特别是在服务器管理和自动化运维场景下。这个服务能够定期执行某些任务,并通过电子邮件的方式将结果或通知发送给相关人员。下面,我们将详细探讨这一主题。...
- **线程通信**:主要通过wait()、notify()和notifyAll()方法,以及高级的BlockingQueue队列实现线程间的协作。 3. **并发集合** - **线程安全的集合**:如ConcurrentHashMap、CopyOnWriteArrayList等,它们在...
Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip 涉及到的技术点 - 线程池ThreadPoolExecutor - 阻塞队列BlockingQueue,生产者消费者模式 - Selector - Channel - ByteBuffer - ...
在给定的文件名"PowerOff"中,虽然没有具体说明,但可能指的是一个与关闭系统或电源管理相关的程序或服务。在这种情况下,如果使用生产者与消费者模式,生产者可能负责收集系统状态信息,如能耗、负载等,而消费者则...
以下是对Java语法和用法的一些详细说明,以及与之相关的重点技能点。 一、面向对象的三大特性 1. 封装:封装是将数据和操作数据的方法捆绑在一起,形成一个独立的单元——类。在Java中,我们通过访问修饰符...
这很好地说明了如何构建线程之间可以共享的数据结构。 设计: 在此设计中,有一个结构BlockingQueue ,其中包含一些方法: Methods: 1. new() -> Self Create new empty BlockingQueue<T>. 2. en_q(&self, t: T...
以下是对给定文件中涉及的知识点的详细说明: 1. **线程池与工作队列** (Java 理论与实践:线程池与工作队列.doc): - **线程池** 是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动...
`BlockingQueue`内置了同步机制,可以避免数据竞争,当队列满时,`put()`操作会阻塞生产者,当队列空时,`take()`操作会阻塞消费者。 4. **测试与分析**: 设计测试用例来验证生产者和消费者的正确性,包括各种...
`Queue`类可能是一个线程安全的数据结构,如`java.util.concurrent`包下的`BlockingQueue`,用于存储待处理的电梯请求,确保在多线程环境中的正确同步。 接着,我们有`selectelevator.java`和`elevatortest5.java`...
在本文提供的示例代码中,`BlockingQueue` 是一个基于双缓冲、互斥锁和条件变量实现的阻塞队列。队列由两个内部队列(`_read_queue` 和 `_write_queue`)组成,用于实现双缓冲策略,减少数据插入和提取时的冲突。`...
5. **源码打包**:这表明项目包含了完整的源代码,可能还包含了编译和运行的说明,以便于学习者理解代码结构,调试和运行项目。 这个毕业设计为学习者提供了一个实践生产者消费者问题的平台,帮助他们深入理解Java...
下面通过一个简单的例子来说明如何实现生产者-消费者模式: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerExample { public static void main(String[] args) { // ...
- **BlockingQueue** 接口及其实现如`ArrayBlockingQueue`,`LinkedBlockingQueue`,提供了线程安全的数据结构,便于实现生产者消费者模型。 6. **线程池** - **ExecutorService** 和 `ThreadPoolExecutor` 用于...
3. **并发工具类(Concurrent Utilities)**:JDK1.6加强了并发编程的支持,新增了`java.util.concurrent`包,包含如`ExecutorService`、`Future`、`BlockingQueue`等线程池和同步工具类,简化了多线程编程。...
- **线程通信**:推荐使用`wait/notify`、`BlockingQueue`等机制进行线程间的通信。 4. **异常与日志**: - **异常处理策略**:明确异常的捕获与处理方式,如何正确抛出和记录异常信息。 - **日志规范**:建议...
下面通过一个具体的例子来说明如何使用 `LinkedBlockingQueue`: ```java import java.util.concurrent.*; public class BlockingQueueTest2 { // 定义一个篮子类 public class Basket { // 初始化篮子的容量...
以下是这些主题的详细说明: 1. **Tomcat**:作为Java Servlet容器,Tomcat是Web应用程序的基础。了解其工作原理,如生命周期管理、线程模型、部署流程和性能优化是必要的。理解Context、Loader、Wrapper等组件的...
说明 这是利用可配置线程池和Java NIO的简单可伸缩服务器的示例。 客户端用于生成随机生成的字符串,并以设置的时间间隔将消息发送到服务器。 服务器从客户端接收字符串,并使用哈希函数SHA1对其进行哈希处理,然后...