BlockingQueue队列
1.BlockingQueue定义的常用方法如下
抛出异常 | 特殊值 | 阻塞 | 超时 | |
插入 | add(e) | offer(e) | put(e) | offer(e,time,unit) |
移除 | remove() | poll() | take() | poll(time,unit) |
检查 | element() | peek() | 不可用 | 不可用 |
1)add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回异常
2)offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.
3)put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续.
4)poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null
5)take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止
2、BlockingQueue的几个注意点
【1】BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个remainingCapacity,超出此容量,便无法无阻塞地put 附加元素。没有任何内部容量约束的BlockingQueue 总是报告Integer.MAX_VALUE 的剩余容量。
【2】BlockingQueue 实现主要用于生产者-使用者队列,但它另外还支持Collection
接口。因此,举例来说,使用remove(x) 从队列中移除任意一个元素是有可能的。然而,这种操作通常不 会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。
【3】BlockingQueue 实现是线程安全的。所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。然而,大量的 Collection 操作(addAll、containsAll、retainAll 和removeAll)没有 必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了c 中的一些元素后,addAll(c) 有可能失败(抛出一个异常)。
3、简要概述BlockingQueue常用的实现类
ArrayBlockingQueue
实现细节
1.基于数组实现循环队列: 也就意味着预分配了空间,不过基于数组在性能上比基于链表的实现性能高些(CPU cache更友好吧)
2.在读写队列的时候都是用一个ReentrantLock对整个队列上锁(默认非公平锁,公平锁会线程饥饿)。
3.一旦创建,大小固定,有界队列。比较适合作为有界缓冲。大小固定,也就不必纠结空间回收的问题了,这个是优点也是缺点,看怎么理解了。
4.实现中使用了Condition来控制notFull和notEmpty条件: 例如take取数据的时候由于队列空了被阻塞;有新的数据put了,就可以signal那些take数据被阻塞的线程了。不利用Condition的话自己利用Object的notify、wait方法也可以做,不过显然麻烦多了。
应用场景
比较适合作为有界缓冲。
LinkedBlockingQueue
实现细节
1.基于链表实现: 大小可变,更加灵活。默认最大大小为Integer.MAX_VALUE。
2.在队首(putLock)和队尾使用两把锁: 可以实现读写并发,吞吐性能比ArrayBlockingQueue好很多,
也利用Condition来做非空非满的条件判断
应用场景
常见的不涉及大量互斥资源的生产消费的情况,都可以用该类实现生产消费模型
SynchronousQueue
总结下有以下特点:
1.容量永远为0
2.适合一对一的生产消费场景,由于经过很多优化,性能是很好的。因此容量为1的队列,就别使用其他阻塞queue了
3.实现上也用了CAS、自旋锁
应用场景
性能比前面几种Queue都要高
适合当做一个生产者和消费者之间的汇合点,传递数据。
DelayedQueue
原理
1.延迟队列内部使用优先队列管理任务
2.使用一个availabe Condition条件来做唤醒
3.使用的heap数据结构(因为用的优先队列是基于堆得)
应用场景
延迟任务、定期任务、周期任务
PriorityBlockingQueue
原理
1.存储的对象必须是实现Comparable接口
2.基于heap的数据机构(array-based binary heap)
应用场景
有优先级的任务
LinkedTransferQueue
原理
1.非阻塞
2.基于CAS无锁
3.Doug Lea说从功能角度来讲,LinkedTransferQueue实际上是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集。而且LinkedTransferQueue更好用,因为它不仅仅综合了这几个类的功能,同时也提供了更高效的实现。
BlockingQueue队列的更多相关文章
- BlockingQueue<> 队列的作用
BlockingQueue<> 队列的作用 BlockingQueue 实现主要用于生产者-使用者队列 BlockingQueue 实现主要用于生产者-使用者队列,BlockingQueu ...
- BlockingQueue队列学习
今天看了下BlockingQueue的几种实现,记录下以便以后复习. 首先来看一下BlockingQueue的家族成员: BlockingQueue除了先进先出外,还有两个操作:在队列为空时,获取元素 ...
- Java中的BlockingQueue队列
BlockingQueue位于JDK5新增的concurrent包中,它很好地解决了多线程中,如何高效安全地“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极 ...
- Java -- 使用阻塞队列(BlockingQueue)控制线程通信
BlockingQueeu接口是Queue的子接口,但是它的主要作用并不是作为容器,而是作为线程同步的工具. 特征: 当生产者线程试图向BlockingQueue中放入元素时,如果该队列已满,则该线程 ...
- 队列BlockingQueue的简单例子
队列,当进行多线程编程的时候,很多时候可能会用到,队列是先进先出的,我们可以将要执行的任务放置在队列内缓存起来,当线程池中线程可以使用的时候,我们就从队列中获取一个任务执行.. 当前是一个队列的简单例 ...
- java并发编程工具类JUC第一篇:BlockingQueue阻塞队列
Java BlockingQueue接口java.util.concurrent.BlockingQueue表示一个可以存取元素,并且线程安全的队列.换句话说,当多线程同时从 JavaBlocking ...
- java.util.concurrent 包笔记 --- BlockingQueue
BlockingQueue 队列接口,具有 4 组不同的方法用于插入.移除以及对队列中的元素进行检查.如果请求的操作不能得到立即执行的话,每个方法的表现也不同.这些方法如下: Throws exc ...
- 线程池 队列 synchronized
线程池 BlockingQueue synchronized volatile 本章从线程池到阻塞队列BlockingQueue.从BlockingQueue到synchronized 和 volat ...
- 从构建分布式秒杀系统聊聊Disruptor高性能队列
前言 秒杀架构持续优化中,基于自身认知不足之处在所难免,也请大家指正,共同进步.文章标题来自码友 简介 LMAX Disruptor是一个高性能的线程间消息库.它源于LMAX对并发性,性能和非阻塞算法 ...
随机推荐
- Deinstall卸载RAC之Oracle软件及数据库+GI集群软件
Deinstall卸载Oracle软件及数据库+GI集群软件 1. 本篇文档应用场景: 需要安装新的ORACLE RAC产品,系统没有重装,需要对原环境中的RAC进行卸载: #本篇文档,在AIX 6. ...
- JAVA基础部分复习(二、集合类型)
对于这些常用的集合,建议还是需要先了解一下底层实现原理,这样在不同的使用场景下才能选择更好的方案. Set介绍以及对比,常用方法: package cn.review.day02; import ja ...
- 关于Nor Flash、Nand Flash等等
[Nor Flash] Nor Flash的“读取”和RAM很类似,只要能能够提供数据的地址,数据总线就能够正确的给出数据,但不可以直接进行“写”操作: Nor Flash的写操作,需要遵循特定的命令 ...
- Mysql 创建数据库命令
GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; UTF8: CREATE DATABASE ` ...
- ZOJ - 4082:Little Sub and his Geometry Problem (双指针)
Little Sub loves math very much, and has just come up with an interesting problem when he is working ...
- D:\yyy\UNetSegmentation_code_20180301\data\train
key1 numpy.save("filename.npy",a) 利用这种方法,保存文件的后缀名字一定会被置为.npy,这种格式最好只用 numpy.load("fil ...
- PTA——龟兔赛跑
PTA 7-39 龟兔赛跑 #include <stdio.h> int main () { ,turtle=,minute,rest=-,run=; //rest为0或负时,兔子休息,r ...
- Linux 进程管理 笔记
https://www.ibm.com/developerworks/cn/linux/l-linux-process-management/index.htmlLinux 进程管理剖析 进程可以是短 ...
- (4)django的新手三件套(返回页面、返回字符、重定向)
from django.shortcuts import render,HttpResponse,redirect 新手三件套,前期开发都会用到 render #向浏览器返回页面 HttpResp ...
- 51cto-spring boot(一Spring4快速入门)
https://search.maven.org/classic 查找maven依赖的pom.xml文件