Java中常用七个阻塞队列的总结
Java队列总结
通过前面文章的学习,我们对Java中常用队列做了介绍。本文,咱们来对队列做个总结吧。
首先,我们介绍了现实生活中的实际场景(排队买票等),来告诉我们为什么需要使用队列。
队列是一种先进先出(FIFO)的抽象数据结构,在Java中,队列使用了两种数据类型来实现的,分别是:数组和链表这两种数据结构。
本文主要内容:回顾Java中常用的七个阻塞队列进行总结及阻塞队列中四组AP并进行总结。
本文来源:本文是由凯哥Java(kaigejava)原创发布。
接着,我们介绍了队列的分类,可以分为两类,即阻塞队列和非阻塞队列。
常用的三个非阻塞队列:LinkedList、PriorityQueue和ConcurrentLinkedQueue.
(PS:凯哥没有做介绍,在以后的文章中,凯哥将对ConcurrentLinkedQueue进行介绍)
然后我们介绍Java中常用的七个阻塞队列。他们之间类图关系:
我们可以看到,队列是Collection的子类。也即和arrayList类似的。
接着我们就对七个阻塞队列做了详细的介绍。
阻塞队列的七个子类
ArrayBlockingQueue(下文简称:ABQueue)、LinkedBlockingQueue(下文简称:LBQueue)、PriorityBlockingQueue(下文简称:PBQueue)、DelayQueue(下文简称:DQueue)、SynchronouseQueue(下文简称:SyncQueue)、LinkedTrnsferQueue(下文简称:LTQueue)、LinkedBlockingDeque(下文简称:LBDeque)这个七个。
来分别说说每个队列的特点:
ABQueue:
底层使用的是数组结构。因为数组需要初始化大小,所以其构造器需要输入队列的大小。
是有界的阻塞安全队列(思考:为什么说是有界的?是怎么保证线程安全的?),默认是不保证线程的公平性(思考:为什么默认不能保证线程公平?如何保证线程安全?),不允许向队列中插入null元素。
LBQueue:
“有界”的阻塞安全队列,其底层使用的是链表的数据结构。所谓的“有界”是因为,默认队列的大小是Integer.MAX_VALUE。这个数值等于21亿+。因为这个数据太大了,也可以理解为无界的。不建议使用默认值,最好在初始化的时候,指定队列的大小。
PBQueue:
是一个支持优先级的无界队列。支持优先级是因为使用了comparator这个接口。默认采用字典升序排序策略的。如果不想使用默认的,在初始化的时候,还可以自定义比较器的。
以上三个队列相关更详细的介绍,欢迎回看《Java中常用的七个阻塞队列介绍第一篇》。在这篇文章中,凯哥对这三个队列做了详细的介绍以及代码演示。
DQueue:
是一个支持优先级的无界阻塞队列。支持优先级是应该底层使用的是PriorityQueue队列来实现的。而PriorityQueue队列在添加元素的时候使用了siftUpComparable方法。这个对了的一个特点:支持延时获取。所以,这个队列可以运用在缓存系统的设计中。当从队列中获取到数据,说明延时时间到了。
关于DQueue更多详细的介绍,欢迎回看:《Java中常用的七个阻塞队列第二篇DelayQueue源码介绍》。在这篇文章中,凯哥做了详细的介绍,同时使用代码模拟了缓存数据到期操作。
SyncQueue:
是一个无存储空间的阻塞同步队列。不存储元素的原因是因为,一个put操作必须等待一个take操作与之对应才可以。否则就不能继续添加元素了。默认使用非公平的。在性能上SyncQueue队列的吞吐量比LBqueu和ABQueue的性能高。
LTQueue:是由链表组成的无界队列。比其他队列多了两个方法:tryTransfer、transfer
LBDeque:链表组成的双端队列。这个队列在以后凯哥讲For/Join框架的时候,还会说到。
七个阻塞队列的小总结:
接着,我们讲解了队列中常用的四组API。
阻塞队列四组API
会抛异常的:添加元素使用add(e),删除元素使用remove,检查队首元素使用的element.
当队列满的时候,在向队列中添加元素会抛出异常;当队列为空的时候在从队列中删除或者是获取队首元素都会抛出异常;
带有返回值的:添加元素:offer(e),删除元素:poll(),检查队首元素:peek().
当队列满的时候,再调用offer(e)向队列中添加元素会返回false而不是抛出异常
当队列为空的时候,调用take()或者是peek()方法返回null而不是抛出异常
阻塞一直等待的:添加元素:put(e),删除元素:take()
当队列满的时候,再向队列中添加元素,队列会进入阻塞状态,直到元素添加成功为止。
当队列为空的时候,再从队列删除元素,队列会阻塞,直到能够删除元素为止。
带有超时时间的阻塞:添加元素:offer(e,time,unit),删除元素:poll(time,unit)
当队列满的时候,调用offer(e,time,unit)会进入阻塞等待中,当过来超时时间,退出等待
当队列为空的时候,调用poll(time,unit)方法会进入等待状态,当到了超时时间,会退出等待。
四组API总结:
关于四组API更详细的介绍欢迎学习:《Java阻塞队列的四组API》。在这篇文章中凯哥做了详细的介绍。用人的一生四个阶段来比拟这四组API。
到此,我们已经把Java中队列介绍完毕。接下来,凯哥将带着大家一起学习线程池。欢迎大家继续学习。
Java中常用七个阻塞队列的总结的更多相关文章
- Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
Java中常用的七个阻塞队列第二篇DelayQueue源码介绍 通过前面两篇文章,我们对队列有了了解及已经认识了常用阻塞队列中的三个了.本篇我们继续介绍剩下的几个队列. 本文主要内容:通过源码学习De ...
- Java中常用的七个阻塞队列介绍第一篇
Java中常用的七个阻塞队列介绍第一篇 在上一篇我们对Java中的队列分类做了简单的介绍.本文咱们主要来聊聊阻塞队列中的七个常用子类.这七个阻塞队列的学习步骤:先看源码,分析完源码之后,我们再来对每个 ...
- 动图+源码,演示Java中常用数据结构执行过程及原理
最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...
- 动图+源码,演示 Java 中常用数据结构执行过程及原理
阅读本文大概需要 3.7 分钟. 作者:大道方圆 cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想 ...
- 25、Java并发性和多线程-阻塞队列
以下内容转自http://ifeve.com/blocking-queues/: 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操 ...
- 最全java多线程总结3——了解阻塞队列和线程安全集合不
看了前两篇你肯定已经理解了 java 并发编程的低层构建.然而,在实际编程中,应该经可能的远离低层结构,毕竟太底层的东西用起来是比较容易出错的,特别是并发编程,既难以调试,也难以发现问题,我们还是 ...
- java中使用Semaphore构建阻塞对象池
java中使用Semaphore构建阻塞对象池 Semaphore是java 5中引入的概念,叫做计数信号量.主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量. Semaphore中定 ...
- Java中常用的查找算法——顺序查找和二分查找
Java中常用的查找算法——顺序查找和二分查找 神话丿小王子的博客 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位 ...
- java中常用的工具类(三)
继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类 ...
随机推荐
- 这可能是 Github 上最全面的 Flutter 教程
引语 晚上好,我是猫咪,我的公众号「程序媛猫咪」会推荐 GitHub 上好玩的项目,挖掘开源的价值,欢迎关注我. 刚下班到家,金三银四,虽然今天行情尤其地不好,但身边的同事也是走了一波,不免会受到影响 ...
- 使用webview查找元素,appium查找web页面元素
9 webview查找元素 9.1 webview 简介 WebView是android中一个非常重要的控件,它的作用是用来展示一个web页面.它使用的内核是webkit引擎,4.4版本之后,直接使用 ...
- 29.2 Iterator 迭代器ConcurrentModificationException:并发修改异常处理
/** Iterator:迭代器* * 需求:判断集合中是否包含元素java,如果有则添加元素android * Exception in thread "main" java.u ...
- synchronized 的真正含义
@synchronized 锁的永远是对象 ,只针对于对象,只能锁对象,常量等是不能加synchronized,一旦加编译也不会通过 @synchronized 锁对象中的非static 就是锁调用该 ...
- Centos7_Root密码重置
原因: 最近出去见女朋友,竟然忘了Root用户的密码,此时考验linux基础扎不扎实的时候到了... 操作步骤: 解释补充: mount -o remountr,w / #修改根目录文件系统的权限,实 ...
- ${param.pageNo}是什么意思?
1.${param.id}与request.getParameter("id"):功能相同2.param.id获取输入的参数id,也可理解为的是form或者div表单里的ID. r ...
- 文件上传——客户端检测绕过(JavaScript检测)(一)
前言 通常再一个web程序中,一般会存在登陆注册功能,登陆后一般会有上传头像等功能,如果上传验证不严格就可能造成攻击者直接上传木马,进而控制整个web业务控制权.下面通过实例,如果程序只进行了客户端J ...
- AJ学IOS 之第一次打开Xcode_git配置,git简单学习
AJ分享,必须精品 一:错误 当第一次打开Xcode我们进行commit操作的时候会报错: The working copy “测试” failed to commit files. * Please ...
- stand up meeting 12-3
因为前后端在参数传递定义不清晰的原因,今天士杰和国庆采用了pair programming的方法,在一台电脑前工作了四十分钟,明确了请求questionpool,请求question,请求rank d ...
- vue2.x学习笔记(三)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12562137.html. vue实例 要使用vue提供的特性与功能,都需要通过vue实例来使用. 创建一个vue实 ...