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中常用七个阻塞队列的总结的更多相关文章

  1. Java中常用的七个阻塞队列第二篇DelayQueue源码介绍

    Java中常用的七个阻塞队列第二篇DelayQueue源码介绍 通过前面两篇文章,我们对队列有了了解及已经认识了常用阻塞队列中的三个了.本篇我们继续介绍剩下的几个队列. 本文主要内容:通过源码学习De ...

  2. Java中常用的七个阻塞队列介绍第一篇

    Java中常用的七个阻塞队列介绍第一篇 在上一篇我们对Java中的队列分类做了简单的介绍.本文咱们主要来聊聊阻塞队列中的七个常用子类.这七个阻塞队列的学习步骤:先看源码,分析完源码之后,我们再来对每个 ...

  3. 动图+源码,演示Java中常用数据结构执行过程及原理

    最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...

  4. 动图+源码,演示 Java 中常用数据结构执行过程及原理

    ​阅读本文大概需要 3.7 分钟. 作者:大道方圆 cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想 ...

  5. 25、Java并发性和多线程-阻塞队列

    以下内容转自http://ifeve.com/blocking-queues/: 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操 ...

  6. 最全java多线程总结3——了解阻塞队列和线程安全集合不

      看了前两篇你肯定已经理解了 java 并发编程的低层构建.然而,在实际编程中,应该经可能的远离低层结构,毕竟太底层的东西用起来是比较容易出错的,特别是并发编程,既难以调试,也难以发现问题,我们还是 ...

  7. java中使用Semaphore构建阻塞对象池

    java中使用Semaphore构建阻塞对象池 Semaphore是java 5中引入的概念,叫做计数信号量.主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量. Semaphore中定 ...

  8. Java中常用的查找算法——顺序查找和二分查找

    Java中常用的查找算法——顺序查找和二分查找 神话丿小王子的博客 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位 ...

  9. java中常用的工具类(三)

    继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类       ...

随机推荐

  1. 34 io流-- 打印流和对象流

    概述 io流分为字符流和字节流,具体分类相见下图 字符流:char 一些基本文本的数据传输 字节流:byte 图片.视频等用文本查看器查看不了的文件都是二进制文件,只能用字节流传输,使用字符流cp的看 ...

  2. 有关google的guava工具包详细说明

    Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库. 目前主要包含: com.google.common.annotations c ...

  3. Java中都通用文件下载(ContentType、文件头、response、out四步骤)

    Java中都通用文件下载(ContentType.文件头.response.out四步骤) 新浪微博:IT国子监(记得关注噢) http://weibo.com/itguozijian   我们就直接 ...

  4. Xray安装与使用

    0×00 Xray简介 xray是从长亭洞鉴核心引擎中提取出的社区版漏洞扫描神器,支持主动.被动多种扫描方式,自备盲打平台.可以灵活定义 POC,功能丰富,调用简单,支持 Windows / macO ...

  5. AJ学IOS(08)UI之热门_喜马拉雅UI实现-UIScrollView的使用

    AJ分享,必须精品 先看效果 storyBoard用到的控件 代码实现 */ // // NYViewController.m // 05 - 喜马拉雅 // // Created by apple ...

  6. D3.js 力导向图的拖拽(drag)与缩放(zoom)

    不知道大家会不会跟我一样遇到这样的问题,在之前做的力导向图的基础上加上缩放功能的时候,拖动节点时整体会平移不再是之前酷炫的效果(失去了拉扯的感觉!).天啊,简直不能接受如此丑X的效果.经过不懈的努力终 ...

  7. Java匹马行天下之JavaSE核心技术——异常处理

    Java匹马行天下之JavaSE核心技术——异常处理 异常的简介 在Java中,异常就是Java在编译.运行或运行过程中出现的错误. 程序错误分为三种:编译错误.运行时错误和逻辑错误 编译错误是因为程 ...

  8. Xshell 设置右键粘贴即是复制

    打开工具->选项->键盘和鼠标面板     1.鼠标部分的右击设置"粘贴剪切板的内容".    2.选择部分,在"自动将所选文本复制到剪切板"前打勾

  9. [GitHub] 75+的 C# 数据结构和算法实现

    C#中标准数据结构和算法的即插即用类库项目 GitHub:https://github.com/aalhour/C-Sharp-Algorithms Watch: 307 Star: 3.4k For ...

  10. gloo基本知识

    Architechture(架构) Gloo通过Envoy XDS gRPC API来动态更新Envoy配置, 更方便的控制Envoy Proxy, 并保留扩展性..本质是一个Envoy xDS配置翻 ...