`
yanguz123
  • 浏览: 570470 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

\(^_^)/ Java中的BlockingQueue接口

 
阅读更多

参考:http://wsmajunfeng.iteye.com/blog/1629354

参考:http://mazhihui.iteye.com/blog/1538762

参考:http://chenzehe.iteye.com/blog/1787759

参考:http://jiangzhengjun.iteye.com/blog/683593

参考:http://c610367182.iteye.com/blog/1953945

 

BlockingQueue的继承结构:


 

 

BlockingQueue的类内容:


 

 

 

 

 概述:

(1).支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用。 

(2).BlockingQueue 不接受 null 元素。试图 add、put 或 offer 一个 null 元素时,某些实现会抛出 NullPointerException。

(3).null 被用作指示 poll 操作失败的警戒值。 

(4).BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个 remainingCapacity,超出此容量,便无法无阻塞地 put 附加元素。没有任何内部容量约束的 BlockingQueue 总是报告 Integer.MAX_VALUE 的剩余容量。

(5).BlockingQueue 实现主要用于生产者-使用者队列,但它另外还支持 Collection 接口。因此,举例来说,使用 remove(x) 从队列中移除任意一个元素是有可能的。然而,这种操作通常不 会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。 

(6).BlockingQueue 实现是线程安全的。所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。然而,大量的 Collection 操作(addAll、containsAll、retainAll 和 removeAll)没有 必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了 c 中的一些元素后,addAll(c) 有可能失败(抛出一个异常)

(7).BlockingQueue 实质上不支持使用任何一种“close”或“shutdown”操作来指示不再添加任何项。这种功能的需求和使用有依赖于实现的倾向。例如,一种常用的策略是:对于生产者,插入特殊的 end-of-stream 或 poison 对象,并根据使用者获取这些对象的时间来对它们进行解释。 

 

 

 

 

BlockingQueue 方法以四种形式出现,对于不能立即满足但可能在将来某一时刻可以满足的操作,这四种形式的处理方式不同:

第一种是抛出一个异常

第二种是返回一个特殊值(null 或 false,具体取决于操作)

第三种是在操作可以成功前,无限期地阻塞当前线程

第四种是在放弃前只在给定的最大时间限制内阻塞

 

 

  抛出异常 特殊值 阻塞 超时
插入 add(e) offer(e) put(e) offer(e, time, unit)
移除 remove() poll() take() poll(time, unit)
检查 element() peek() 不可用 不可用

 

 

 

 

方法摘要:

 boolean add(E e) 

          将指定元素插入此队列中(如果立即可行且不会违反容量限制),成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。

 boolean contains(Object o) 

          如果此队列包含指定元素,则返回 true。 

 int drainTo(Collection<? super E> c) 

          移除此队列中所有可用的元素,并将它们添加到给定 collection 中。 

 int drainTo(Collection<? super E> c, int maxElements) 

          最多从此队列中移除给定数量的可用元素,并将这些元素添加到给定 collection 中。 

 boolean offer(E e) 

          将指定元素插入此队列中(如果立即可行且不会违反容量限制),成功时返回 true,如果当前没有可用的空间,则返回 false。 

 boolean offer(E e, long timeout, TimeUnit unit) 

          将指定元素插入此队列中,在到达指定的等待时间前等待可用的空间(如果有必要)。 

 E poll(long timeout, TimeUnit unit) 

          获取并移除此队列的头部,在指定的等待时间前等待可用的元素(如果有必要)。 

 void put(E e) 

          将指定元素插入此队列中,将等待可用的空间(如果有必要)。 

 int remainingCapacity() 

          返回在无阻塞的理想情况下(不存在内存或资源约束)此队列能接受的附加元素数量;如果没有内部限制,则返回 Integer.MAX_VALUE。 

 boolean remove(Object o) 

          从此队列中移除指定元素的单个实例(如果存在)。 

 E take() 

          获取并移除此队列的头部,在元素变得可用之前一直等待(如果有必要)。 

 

 

 

 

 

 

BlockingQueue具体的实现类:

 

1..ArrayBlockingQueue

(1).一个由数组支持的有界阻塞队列。

(2).此队列按 FIFO(先进先出)原则对元素进行排序。

(3).队列的头部是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。

(4).新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素。 

(5).这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。

(6).试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。 

(7).此类支持对等待的生产者线程和使用者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。然而,通过将公平性 (fairness) 设置为 true 而构造的队列允许按照 FIFO 顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”。 

(8).此类及其迭代器实现了 Collection 和 Iterator 接口的所有可选 方法。 。 

 

2.LinkedBlockingQueue

(1).一个基于已链接节点的、范围任意的 blocking queue。

(2).此队列按 FIFO(先进先出)排序元素。

(3).队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。

(4).新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。

(5).链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。 

(6).可选的容量范围构造方法参数作为防止队列过度扩展的一种方法。如果未指定容量,则它等于 Integer.MAX_VALUE。除非插入节点会使队列超出容量,否则每次插入后会动态地创建链接节点。 

(7).此类及其迭代器实现 Collection 和 Iterator 接口的所有可选 方法。 

 

 

3.LinkedBlockingDeque:

(1).一个基于已链接节点的、任选范围的阻塞双端队列。 

(2).可选的容量范围构造方法参数是一种防止过度膨胀的方式。如果未指定容量,那么容量将等于 Integer.MAX_VALUE。

(3).只要插入元素不会使双端队列超出容量,每次插入后都将动态地创建链接节点。 

(4).大多数操作都以固定时间运行(不计阻塞消耗的时间)。

(5).异常包括 remove、removeFirstOccurrence、removeLastOccurrence、contains、iterator.remove() 以及批量操作,它们均以线性时间运行。 

(6).此类及其迭代器实现 Collection 和 Iterator 接口的所有可选 方法。 

 

4.PriorityBlockingQueue:

(1).一个无界阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞获取操作。

(2).虽然此队列逻辑上是无界的,但是资源被耗尽时试图执行 add 操作也将失败(导致 OutOfMemoryError)。

(3).此类不允许使用 null 元素。

(4).依赖自然顺序的优先级队列也不允许插入不可比较的对象(这样做会导致抛出 ClassCastException)。 

(6).此类及其迭代器可以实现 Collection 和 Iterator 接口的所有可选 方法。

(7).iterator() 方法中提供的迭代器并不 保证以特定的顺序遍历 PriorityBlockingQueue 的元素。

(8).如果需要有序地进行遍历,则应考虑使用 Arrays.sort(pq.toArray())。

(9).可以使用方法 drainTo 按优先级顺序移除 全部或部分元素,并将它们放在另一个 collection 中。 

(10).在此类上进行的操作不保证具有同等优先级的元素的顺序。如果需要实施某一排序,那么可以定义自定义类或者比较器,比较器可使用修改键断开主优先级值之间的联系。

 

5.SynchronousQueue

(1).一种阻塞队列,其中每个插入操作必须等待另一个线程的对应移除操作 ,反之亦然。

(2).同步队列没有任何内部容量,甚至连一个队列的容量都没有。

(3).不能在同步队列上进行 peek,因为仅在试图要移除元素时,该元素才存在;除非另一个线程试图移除某个元素,否则也不能(使用任何方法)插入元素;也不能迭代队列,因为其中没有元素可用于迭代。

(4).队列的头 是尝试添加到队列中的首个已排队插入线程的元素;如果没有这样的已排队线程,则没有可用于移除的元素并且 poll() 将会返回 null。

(5).对于其他 Collection 方法(例如 contains),SynchronousQueue 作为一个空 collection。

(6).此队列不允许 null 元素。 

(7).同步队列类似于 CSP 和 Ada 中使用的 rendezvous 信道。它非常适合于传递性设计,在这种设计中,在一个线程中运行的对象要将某些信息、事件或任务传递给在另一个线程中运行的对象,它就必须与该对象同步。 

(8).对于正在等待的生产者和使用者线程而言,此类支持可选的公平排序策略。默认情况下不保证这种排序。但是,使用公平设置为 true 所构造的队列可保证线程以 FIFO 的顺序进行访问。 

(9).此类及其迭代器实现 Collection 和 Iterator 接口的所有可选 方法。 

 

6.DelayQueue

(1).Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。

(2).该队列的头部 是延迟期满后保存时间最长的 Delayed 元素。

(3).如果延迟都还没有期满,则队列没有头部,并且 poll 将返回 null。

(4).当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于等于 0 的值时,将发生到期。

(5).即使无法使用 take 或 poll 移除未到期的元素,也不会将这些元素作为正常元素对待。例如,size 方法同时返回到期和未到期元素的计数。此队列不允许使用 null 元素。 

(6).此类及其迭代器实现了 Collection 和 Iterator 接口的所有可选 方法。 

 

 

 

 

  • 大小: 9.1 KB
  • 大小: 4.8 KB
分享到:
评论

相关推荐

    Java中的BlockingQueue:深入理解与实践应用

    在Java并发编程中,BlockingQueue是一个非常重要的接口,它提供了线程安全的队列操作,特别是在生产者-消费者模式中发挥着核心作用。本文将深入探讨BlockingQueue的工作原理、常见实现、使用场景以及代码示例。 在...

    seaworld_java线程_java_doingw91_

    在“seaworld_java线程_java_doingw91_”这个项目中,我们主要探讨的是如何使用Java Swing构建一个海底世界的模拟应用,并且涉及到Java线程的运用。这是一个很好的实践示例,可以帮助我们深入理解Java图形用户界面...

    基于java中BlockingQueue的使用介绍

    BlockingQueue接口 BlockingQueue 接口继承了 Queue 接口,并增加了几个关键的阻塞操作: - `put(E e)`:将指定的元素插入到此队列的尾部,如果队列已满,则阻塞,直到队列中有空位。 - `offer(E e)`:与 `put()`...

    javamianshi.rar_C 面试题_MHT_java 试题_java 面试题

    2. **面向对象编程**:Java是面向对象的语言,面试中会涉及类、对象、封装、继承、多态等概念,以及抽象类、接口的区别和使用场景。 3. **集合框架**:ArrayList、LinkedList、HashSet、HashMap、TreeSet、TreeMap...

    java_thread_cn.rar_Java 线程池_java thread books_java线程_线程池_线程池调度

    在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`ExecutorService`接口和它的实现类,如`ThreadPoolExecutor`。`ExecutorService`定义了线程池的基本操作,如执行任务、关闭线程池等。而`...

    java_chat.rar_java 聊天室_java聊天室_java聊天室程序_java鑱婂ぉ_java鑱婂ぉ瀹

    Java提供了JDBC(Java Database Connectivity)接口,方便与各种数据库进行交互。 通过分析这个"Java聊天室程序"的源代码,开发者可以深入理解上述技术的实践应用,也可以学习到如何设计和实现一个实时的、多用户...

    java中线程队列BlockingQueue的用法

    `BlockingQueue`是Java中的一个接口,它继承自`Queue`接口,并添加了阻塞操作。Java提供了一些内置的实现类,如`ArrayBlockingQueue`、`LinkedBlockingQueue`、`PriorityBlockingQueue`等,它们各有特点,适用于...

    BlockingQueue队列自定义超时时间取消线程池任务

    在Java编程中,`BlockingQueue`是一个非常重要的并发工具类,它主要用于线程间的数据通信。`newFixedThreadPool`是`java.util.concurrent`包中的一个线程池工厂方法,用于创建固定数量线程的线程池。`FutureTask`则...

    Multi person chat_jdk1.8_java编程_

    5. **线程间通信**:Java提供了阻塞队列(BlockingQueue)等机制,可以方便地实现在线程间的通信和数据传递,例如生产者消费者模型。 在实际开发中,为了实现多人聊天功能,开发者还需要熟悉Socket编程,理解TCP/IP...

    JavaThreaddemo_DEMO_tidecme_线程池Java_

    在Java中,`java.util.concurrent` 包提供了线程池的相关实现,其中ExecutorService是线程池的核心接口,ThreadPoolExecutor是其最常见的实现类。 线程池的创建通常通过`Executors`工厂类来完成,例如,我们可以...

    MyQQ.rar_MYQQ_myqq java

    Java提供了synchronized关键字和其他并发工具类,如Semaphore和BlockingQueue,用于控制对共享资源的访问,防止数据不一致和死锁。 5. **用户界面**:Java Swing或JavaFX库可用于创建聊天室的图形用户界面,提供...

    2011.08.30(2)——— java BlockingQueue ExecutorService

    2. BlockingQueue接口的作用及其常用实现类的特点。 3. ExecutorService接口及其在多线程编程中的作用。 4. 如何创建和配置ThreadPoolExecutor。 5. 使用BlockingQueue与ExecutorService协同工作的示例代码。 6. ...

    concurrent_programming_in_java_design_principles_a_Currency_desi

    在Java编程中,处理并发主要有两种方式:通过同步机制(如synchronized关键字和Lock接口)和通过并发工具类(如Semaphore、CyclicBarrier、ConcurrentHashMap等)。设计并发程序时,我们需要遵循一系列原则,如最小...

    线程----BlockingQueue

    `BlockingQueue`是一种特殊类型的队列,主要用于多线程环境中的任务管理。它具有以下特性:当队列为空时,从队列中获取元素的操作会被阻塞;同样地,当队列满时,向队列中添加元素的操作也会被阻塞。这种特性使得`...

    Java进阶学习资料.zip

    2. 多线程:掌握并发编程的基础,包括线程的创建、同步与通信(synchronized、wait/notify、Lock接口)以及并发容器如ConcurrentHashMap和BlockingQueue。 3. 设计模式:学习并实践23种经典设计模式,如工厂模式、...

    Java_0613_java_源码

    首先,`PriorityBlockingQueue`实现了`BlockingQueue`接口,这意味着它支持阻塞插入(put)和移除(take)操作。当队列为空时,`take()`方法会阻塞直到有元素可用;当队列满时,`put()`方法也会阻塞直到有空间可用。...

    src1_java_

    【标题】"src1_java_" 涉及的是Java编程语言中的多线程主题,通过提供的代码示例来深入理解并实践这一核心概念。 【描述】提到的"Java codes to explain the topics of threads"着重强调了Java语言如何处理并发执行...

    producer-java.rar_java 生产者 消费者_java 生产者消费者_producer.java_生产者 消费者

    这个问题可以通过使用同步机制来解决,如Java中的`wait()`、`notify()`和`notifyAll()`方法,以及`BlockingQueue`接口。 在提供的压缩包文件中,`producer.java`可能是实现生产者消费者问题的Java代码示例。通常,...

    java 中 阻塞队列BlockingQueue详解及实例

    BlockingQueue接口提供了多种操作方法,以适应不同的使用场景: 1. `add(anObject)`: 尝试将元素anObject添加到队列中。如果队列已满,此方法会抛出`IllegalStateException`异常。 2. `offer(anObject)`: 如果...

Global site tag (gtag.js) - Google Analytics