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中队列介绍完毕。接下来,凯哥将带着大家一起学习线程池。欢迎大家继续学习。
相关推荐
本实例中使用了`ArrayBlockingQueue`,这是最常用的阻塞队列实现之一,它是一个有界队列,能够按FIFO(先进先出)的顺序处理元素。创建`ArrayBlockingQueue`时,需要指定队列的容量,这有助于防止内存溢出,因为队列...
总结来说,Java中的阻塞队列通过提供一种线程间的协作机制,使得生产者和消费者能有效地共享资源,减少了不必要的竞争和同步开销。不同类型的阻塞队列各有特点,可以根据具体的应用场景和性能需求选择合适的队列类型...
阻塞队列(BlockingQueue)是一种特殊的队列,它支持两个附加操作:阻塞的插入方法put和阻塞的移除方法take。BlockingQueue继承了Queue接口,是Java 5中加入的。 BlockingQueue常用方法示例: 1. add(E e):添加一...
Java中的ArrayBlockingQueue和LinkedBlockingQueue都是典型的阻塞队列实现。 阻塞队列为线程间通信提供了便捷的机制,可以用来协调多个线程的运行,防止多线程直接访问共享资源导致的并发问题。例如,生产者-消费者...
Java中的阻塞队列BlockingQueue是一种并发编程中常用的工具,它实现了线程间的同步和通信。阻塞队列的核心特性在于当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;当队列满时,尝试添加元素的...
本文主要讲解了Java中的阻塞队列、线程池以及File类的相关知识,并涉及到了递归的概念。阻塞队列是并发编程中的一种重要工具,它在多线程环境下的生产者-消费者模型中起到关键作用。线程池则是为了优化线程管理,...
Java中的ArrayBlockingQueue是一个高效的并发数据结构,它是Java并发包`java.util.concurrent`下的一个阻塞队列。本文将深入解析ArrayBlockingQueue的常用方法及其内部实现机制。 ArrayBlockingQueue的核心是一个...
Java 阻塞队列(BlockingQueue)是Java并发编程中的一个重要组件,它在多线程环境下提供了一种高效、安全的数据共享机制。在Java的`java.util.concurrent`包中,阻塞队列是一个线程安全的接口,它在生产者-消费者...
本文将深入探讨Java中用于线程唤醒与阻塞的常用方法,以及它们在实际编程中的应用。 1. **线程的阻塞** - `wait()`: 这个方法属于`Object`类,当一个线程调用对象的`wait()`方法时,它会释放该对象的锁并进入等待...
"Java常用工具类大全,工作5年精心整理.zip"这个压缩包文件很可能包含了一位有经验的Java开发者在五年工作中积累的各种实用工具类,这些工具类能够极大地提高开发效率,简化代码编写。以下是对可能包含的知识点进行...
20. **`java.nio`** 包:非阻塞I/O,提高效率,特别是在服务器端编程中。 21. **`java.util.zip`** 包:处理压缩和解压缩,如GZIPOutputStream和ZipInputStream。 22. **`java.util.jar`** 包:处理JAR文件,如...
在Java编程中,`BlockingQueue`是一个非常重要的并发工具类,它主要用于线程间的数据通信。`newFixedThreadPool`是`java.util.concurrent`包中的一个线程池工厂方法,用于创建固定数量线程的线程池。`FutureTask`则...
在Java中,线程的创建和管理涉及几个关键方法以及一个关键字:`run()`, `start()`, `wait()`, `notify()`, `notifyAll()`, `sleep()`, `yield()`, `join()` 和 `synchronized`。以下是对这些方法和关键字的详细说明...
Java 常用包是 Java 开发中不可或缺的一部分,它们提供了丰富的类库和接口,使得开发者可以更加高效地编写代码。在 Java 中,包(Package)是一种命名空间管理机制,用于组织类和接口,避免命名冲突。下面我们将深入...
2. **工作队列(BlockingQueue)** - 一个阻塞队列,用于存储待处理的任务。当队列满时,生产者会阻塞直到队列有空位;当队列空时,消费者会阻塞直到有新任务可用。 3. **拒绝策略** - 当线程池和工作队列都满载时,...
"java精通+开发案例 经典经典总结"这个主题涵盖了Java学习的核心内容和实战经验,旨在帮助开发者深化对Java的理解并提升开发技能。 一、Java基础 1. 类与对象:Java是面向对象的语言,理解类和对象的概念是基础。类...
在Java编程语言中,工具类(Utility Class)是那些提供了静态方法或常量,用于执行特定任务或提供通用功能的类。这些类不包含公共构造器,通常是为了避免实例化,因为它们的设计目的就是作为静态服务。以下是28个...
在Java中,ArrayBlockingQueue就是一个基于数组实现的阻塞队列。它内部通过维护一个数组和两个指针(head和tail)来实现队列操作。ArrayBlockingQueue提供了线程安全的入队和出队操作,保证了多线程环境下的队列操作...
BlockingQueue(阻塞队列)是一个并发容器,它在多线程环境中提供了高效的同步机制。在这个场景下,BlockingQueue可以作为消息队列的基础,当队列为空时,取消息的操作会阻塞,直到有新的消息到来;当队列满时,尝试...