参考: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 接口的所有可选 方法。
相关推荐
Java中有哪些容器(集合类)? 线程安全和线程不安全的分别有哪些? Map接口有哪些实现类? 描述一下Map put的过程 如何得到一个线程安全的Map? HashMap有什么特点? ConcurrentHashMap是怎么分段分组的? ...
BlockingQueue接口 – 阻塞队列2.1 ArrayBlockingQueue类(有界阻塞队列)2.2 LinkedBlockingQueue类(无界阻塞队列)3. 源码:BlockingQueue实现生产者消费者模式→ 输出结果截图 1. Queue接口 – 队列 public ...
- **`BlockingQueue`** : 这是一个接口,JDK 内部通过链表、数组等方式实现了这个接口。表示阻塞队列,非常适合用于作为数据共享的通道。 - **`ConcurrentSkipListMap`** : 跳表的实现。这是一个 Map,使用跳表的...
BlockingQueue接口 void put(E e) 将指定元素插入此队列,如果没有可用空间,则等待 E take()获取并移除此队列头部元素,如果没有可用元素,则等待 ArrayBlockingQueue 数组结构实现,有界队列,手工固定上限 ...
:lollipop::lollipop::lollipop:全文持续更新中 ... :recycling_symbol::recycling_symbol::recycling_symbol: 零、:rocket::rocket::rocket:数据结构与算法 一、:high-speed_train::railway_car::railway_car::...
Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 ... Java并发程序中的串行,主要来自独占的资源锁 优化策略 缩
并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。...列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue。
此工具我不再更新,里面大多数方法我迁移到了hutool工具包中,而其中一些不常用的功能被遗弃,项目暂留做为以后参考。 common-tools 一、数据库工具类 1、com.baijob.commonTools.db.ds C3p0Ds 和 DruidDs分别是...
看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...
24.2. BlockingQueue接口 73 24.2.1. ArrayBlockingQueue 74 24.2.2. LinkedBlockingQueue 78 24.2.3. LinkedBlockingDeque(双向并发阻塞队列) 84 24.2.4. PriorityBlockingQueue(优先阻塞队列) 85 24.2.5. 总结...
JUC是什么 线程 进程 / 线程 ...BlockingQueue(阻塞队列) 线程池 池化技术 线程池的优势 线程池的特点 线程池三大方法 线程池七大参数 线程池四种拒绝策略 ForkJoin 异步回调 Volatile 指令重排 JMM
17.5.3 BlockingQueue接口介绍 399 17.6 阻塞的栈操作 401 17.6.1 BlockingDeque接口与LinkedBlockingDeque类简介 401 17.6.2 LinkedBlockingDeque类的具体使用 402 17.7 线程安全的单变量操作 403 17.7.1...
JAVA线程基本学习, JAVA多线程的特性= 线程池: 本质上是一个对象池, 用来管理线程资源. 在任务执行前, 需要从线程池中拿出线程来执行. 在任务执行完成之后, 需要把线程放回线程池. 线程池好处: 降低资源的消耗...
java并发库,使用方法和juc包下的类相同(和juc下的工具类实现同样的接口),但是性能比其要高 使用方法 1、拉取代码到本地 2、mvn install代码 3、项目中加入依赖 <groupId>com.lzp</groupId> <artifactId>zp-...
java进阶部分
比 ArrayBlockingQueue 快 目标 目标是在接近零开销的情况下实现极低的延迟。 如何使用我们的低延迟有界队列之一的示例。 // writer thread Executors.newSingleThreadExecutor().execute(new Runnable() { ...
先看看 BlockingQueue 接口的文档说明: 1、add:添加元素到队列里,添加成功返回true,由于容量满了添加失败会抛出 IllegalStateException 异常; 2、offer:添加元素到队列里,添加成功返回true,添加失败...
│ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │ 高并发编程第一阶段08讲、构造Thread对象你...
│ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │ 高并发编程第一阶段08讲、构造Thread对象你...
该工具实现从ES中导出数据,并且可以对导出的数据格式和数据文件做部分自定义,该工具主要使用ES中srcoll接口多线程导出数据. Design 项目采用 Java 构建。 访问ES部分采用官方 RestClient 构建通信。 数据导出方式为...