当前位置:网站首页 > Java基础 > 正文

java阻塞队列实现原理(java阻塞队列实现原理和方法)



今日分享开始啦,请大家多多指教~

今天给大家介绍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阻塞队列实现原理和方法)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

                                                                                                  版权声明


                                                                                                  相关文章:

                                                                                                • java面试题基础题(java面试题题库)2025-02-27 07:18:08
                                                                                                • Java阻塞队列(java阻塞队列原理)2025-02-27 07:18:08
                                                                                                • java 在线教程(java 官方教程)2025-02-27 07:18:08
                                                                                                • java内存模型和java内存结构(java内存模型八种操作)2025-02-27 07:18:08
                                                                                                • javaspring教程(java spring)2025-02-27 07:18:08
                                                                                                • visual studio code配置java环境(visual studio code运行java配置)2025-02-27 07:18:08
                                                                                                • 华为java面试题目(华为java社招面试流程)2025-02-27 07:18:08
                                                                                                • 跨域问题解决方案Java(java 跨域产生的原因和解决方法)2025-02-27 07:18:08
                                                                                                • java字符串转map集合(java字符串转list集合)2025-02-27 07:18:08
                                                                                                • java面试题八股文面试级答案(java面试题八股文面试答案及解析)2025-02-27 07:18:08
                                                                                                • 全屏图片