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. [Python] 字符串加密解密

    1. 最简单的方法是用base64: import base64 s1 = base64.encodestring('hello world') s2 = base64.decodestring(s1 ...

  2. 如何使用npt结合crontab实现集群之间的时间同步

    当我们每个机器的时间都不一致时,假如有一个定时任务,定的10点启动执行.结果namenode十点了启动任务,可是分配到的执行节点DataNode才九点五十导致任务执行失败怎么办?这就需要将机器之间的时 ...

  3. Java学习成长第一集

    由于最近所在项目组的项目临近结尾,所以有时间对自己近来的学习做个总结.不得不说,程序员不学习就退步这句话是真的很让人信服!自己入行将近一年的时间,所学的就是Java开发的专业,很羞愧的是现在的自己能力 ...

  4. api测试用例(编写思路)

    在API的自动化测试维度中,测试维度分为两个维度,一个是单独的对API的验证,客户端发送一个请求后,服务端得到客户端的请求并且响应回复给客户端: 另外一个维度是基于业务场景的测试,基于业务场景的也就是 ...

  5. 详解 JDK8 新增的日期时间类

    JDK8 新增的日期时间类 在本人之前的博文<处理时间的类 -- System类.Date类 .SimpleDateFormat类 与 Calendar类>中,讲到过表示时间的类,有三类: ...

  6. linux上Docker安装gogs私服

    一.背景介绍 Gogs 是一款类似GitHub的开源文件/代码管理系统(基于Git),Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs ...

  7. 进程管理工具 Supervisor

    要想在终端后台常驻进程,首先想到的是在命令后加 & 符号,来达到隐藏程序在后台的目的,尽管看起来进程已经在后台运行了,实际上终端会话关闭时进程还是会被 kill 掉,这种问题一般是采用搭配 n ...

  8. php 关于 & 引用赋值

    $a = ; $b = ; echo $a . echo $b . $a = $b; echo $a . echo $b . $a = &$b; echo $a . echo $b . $a ...

  9. PHP把PNG图片转化为JPG时透明背景变黑色

    $type = exif_imagetype($srcimg); switch($type) { case 1: $simg = imagecreatefromgif($srcimg); break; ...

  10. qt tableview 选择模式

    QAbstractItemView::SingleSelection QAbstractItemView::ContiguousSelection QAbstractItemView::Extende ...