今日分享开始啦,请大家多多指教~
今天给大家介绍Queue队列,在计算机中是必不可少的角色。这是一种数据结构,大家可以把他想象成一个数组。给大家详细分享一下部分内容,篇幅比较长,大家需要耐心观看哦!
这次我们重点来看看Java中的Queue家族,总共涉及到18种Queue。
本篇主要内容如下:
一、Queue
队列原理图
1.1 Queue的介绍
有一个重要的朋友,他的英文名叫Queue,中文名叫队列,无论现实生活中还是计算机的世界中,都是一个很重要的角色。
它是一种数据结构,大家可以把他想象成一个数组,元素从它的一头进入、从另外一头出去,称为FIFO原则(先进先出原则)。
他还有两个亲兄弟:List(列表)、Set(集),他们都是Collection的儿子,他还有一个远房亲戚:Map(映射)。他们都是java.util包这个大家庭的成员哦!
1.2 现实生活中的场景
1.3 计算机世界中的场景
二、高屋建瓴,纵览全局
18种队列分为三大类: 接口、抽象类、普通类。
弄清楚下面的继承实现关系对后面理解18种队列有很大帮助。
三、万物归宗Queue接口
2.1 深入理解Queue接口的本质
2.2 Queue接口的核心方法
总共有3组方法,每一组方法对应两个方法。如下图所示:
Queue的核心方法
(1)比如添加(Insert)元素的动作,会有两种方式:add(e)和offer(e)。如果调用add(e)方法时,添加失败,则会抛异常,而如果调用的是offer(e)方法失败时,则会返回false。offer方法用于异常是正常的情况下使用,比如在有界队列中,优先使用offer方法。假如队列满了,不能添加元素,offer方法返回false,这样我们就知道是队列满了,而不是去handle运行时抛出的异常。
(2)同理,移除(Remove)元素的动作,队列为空时,remove方法抛异常,而poll返回null。如果移除头部的元素成功,则返回移除的元素。
(3)同理,检测(Examine)元素的动作,返回头部元素(最开始加入的元素),但不删除元素, 如果队列为空,则element()方法抛异常,而peek()返回false。
(4)Queue接口没有定义阻塞队列的方法,这些方法在BlockQueue接口中定义了。
(5)Queue实现类通常不允许插入null元素,尽管一些实现类比如LinkedList不禁止插入null,但是还是不建议插入null,因为null也被用在poll方法的特殊返回值,以说明队列不包含元素。
四、双端可用Deque接口
4.1 深入理解Deque接口的原理
双端队列Deque
(1)Deque概念: 支持两端元素插入和移除的线性集合。名称deque是双端队列的缩写,通常发音为deck。大多数实现Deque的类,对它们包含的元素的数量没有固定的限制的,支持有界和无界。
(2)Deque方法说明:
比如Queue的add方法和Deque的addLast方法等价。
注意:peek方法不论是作为栈还是队列,都是从队列的检测队列的头,返回最先加入的元素。比如第一次put 100,第二次put 200,则peek返回的是100。如下图所示:
4.1 哪些类实现了Deque接口
4.2 哪些类继承了Deque接口
五、队列骨架AbstractQueue抽象类
5.1 深入理解AbstractQueue抽象类
AbstractQueue是一个抽象类,继承了Queue接口,提供了一些Queue操作的骨架实现。
AbstractQueue的方法
方法add、remove、element方法基于offer、poll和peek。也就是说如果不能正常操作,则抛出异常。我们来看下AbstactQueue是怎么做到的。
注意:
5.2 哪些类继承了AbstractQueue抽象类
六、阻塞缓冲BlockingQueue接口
6.1 宏观来看BlockingQueue(阻塞队列)
阻塞队列满了的情况
阻塞队列为空的情况
(1)BlockingQueue(阻塞队列)也是一种队列,支持阻塞的插入和移除方法。
(3)阻塞的插入:当队列满时,队列会阻塞插入元素的线程,直到队列不满。
(4)阻塞的移除:当队列为空,获取元素的线程会等待队列变为非空。
(5)应用场景:生产者和消费者,生产者线程向队列里添加元素,消费者线程从队列里移除元素,阻塞队列时获取和存放元素的容器。
(6)为什么要用阻塞队列:生产者生产和消费者消费的速率不一样,需要用队列来解决速率差问题,当队列满了或空的时候,则需要阻塞生产或消费动作来解决队列满或空的问题。
6.2 案例解析
线程A往阻塞队列(Blocking Queue)中添加元素,而线程B从阻塞队列中移除元素。
6.3 操刀BlockingQueue接口
BlockingQueue接口的10个核心方法:
10个核心方法总结如下:
有三大类操作:插入、移除、检查。
6.4 BlockingQueue通过什么来阻塞插入和移除的?
6.5 哪些类继承了BlockingQueue接口?
6.6 哪些类实现了BlockingQueue接口?
6.6 BlockingQueue接口继承了哪些接口
七、双端阻塞BlockingDeque接口
7.1 从原理图上理解BlockDeque
BlockingDeque满了
BlockQueue为空
7.2 BlockingDeque接口方法
是阻塞队列BlockingQueue和双向队列Deque接口的结合。有如下方法:
最后队列中的元素顺序如下:
300, test1, 400。
先添加了test1放到队列的头部,然后在头部的前面放入300,所以300在最前面,成为头部,然后将400放入队列的尾部,所以最后的结果是300, test1, 400。
7.3 BlockDeque和BlockQueue的对等方法
7.4 BlockingDeque的特点
7.5 BlockingDeque接口继承了哪些接口?
7.6 哪些类实现了BlockDeque接口?
八、使命必达TransferQueue接口
8.1 Transfer怎么理解?
如果有消费者正在获取元素,则将队列中的元素传递给消费者。如果没有消费者,则等待消费者消费。我把它称作使命必达队列,必须将任务完成才能返回。
8.2 生活中的案例
8.3 TransferQueue的原理解析
8.3 TransferQueue接口继承了哪些接口?
8.4 哪些类实现了TransferQueue接口?
九、优先由你PriorityQueue类
9.1 理解PriorityQueue类
按照自定义优先级排序
9.2 PriorityQueue类继承了哪些类?
9.2 PriorityQueue类实现了哪些接口?
十、双向链表LinkedList类
10.1 LinkedList的结构
LinkedList的结构
我们来看下节点类Node
10.2 与ArrayList的区别
10.3 LinkedList不是线程安全的
LinkedList不是线程安全的,所以可以使用如下方式保证线程安全。
小结
Java中的Queue家族,总共涉及到18种Queue,今天给大家分享的部分内容,其余部分明天再给大家分享哈~
今日份分享已结束,请大家多多包涵和指点!
到此这篇java阻塞队列实现原理(java阻塞队列实现原理和方法)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/jjc/61069.html