Java 中的 BlockingQueue2024年9月10日 | 11 分钟阅读 在直接深入“阻塞队列”主题之前,让我们先简要了解一下队列。队列是一个有序的对象列表,插入发生在列表的末尾,而删除发生在列表的开头。因此,也说队列是基于 FIFO(先进先出)原则的。 阻塞队列是一种额外支持操作的队列,当尝试检索元素时,它会等待队列非空,当要将元素插入队列时,它会等待队列变为空。Java 1.5 提供了对 BlockingQueue 接口以及其他并发实用类别的支持。 关于阻塞队列的一些要点:
BlockingQueue 实现类由于 BlockingQueue 是一个接口,因此无法直接提供 BlockingQueue 的实例,要实现 BlockingQueue,我们需要创建实现它的类。
LinkedBlockingQueue 和 ArrayBlockingQueue 是用于实现 BlockingDeque 类的类。这两个类分别是 BlockingDeque 和链表数据结构的组合,以及 BlockingDeque 和数组的组合。 使用 BlockingQueue 的语法 我们使用 import 语句来使用上述类,并导入 java.util.concurrent.BlockingQueue 包。 声明一个 BlockingQueue 使用 LinkedBlockingDeque 创建 BlockingQueue 类的对象 使用 ArrayBlockingQueue 创建 BlockingQueue 类的对象 BlockingQueue 接口的方法在 BlockingQueue 的实现中有三类方法: 1. 抛出异常的方法
2. 返回某些值的方法 i. offer( ):它将指定的元素插入到 BlockingQueue 的队列末尾。如果队列已满,则返回 false。该方法还可以与超时一起使用,即可以将时间单位作为参数传递。 例如 此处,value 是要插入到队列中的元素。上述方法将尝试将元素插入 BlockingQueue 100 毫秒。如果元素在 100 毫秒内无法插入,则方法返回 false。 peek( ):它返回 BlockingQueue 的顶部或头部。如果队列为空,则返回 null。 poll( ):它从 BlockingQueue 中删除一个元素。如果队列为空,则返回 null。它也可以与超时一起使用,即可以将时间单位作为参数传递。 3. 阻塞操作的方法
BlockingQueue 类型阻塞队列有两种类型: 1. 无界队列:无界阻塞队列是永不阻塞的队列,因为它的尺寸可以增长到非常大的尺寸。BlockingQueue 的容量将被设置为 Integer.MAX_VALUE。当添加元素时,无界队列的尺寸会增长。 语法 2. 有界队列:另一种类型的阻塞队列是有界队列。可以通过将队列的容量传递给队列的构造函数来创建它。 语法 示例 让我们看一个解释阻塞队列概念的例子。 输出 Content of BLockingQueue : [ A , B , C , D , E , F , G ] The number removed is : A Content of BLockingQueue after deleting one element : [ B , C , D , E , F , G ] 基本操作让我们更广泛地了解可以在阻塞队列上执行的不同操作:
1. 添加元素我们可以以不同的方式将元素添加到“LinkedBlockedDeque”中,具体取决于我们试图将其用作的结构类型。将元素添加到双端队列末尾的最常用方法是“add()”方法。还有一个名为“addAll()”的函数,用于将整个元素集合添加到 LinkedBlockingDeque。为了使用双端队列作为队列,可以在程序中使用“add()”和“put()”等函数。 示例 输出 Contents of Blocking Queue : [ A , B , C , D , E ] Contents of another Blocking Queue : [ A , B , C , D , E ] 2. 访问元素我们可以使用 contains()、element()、peek()、poll() 等方法来访问“LinkedBlockingDeque”的元素。 示例 输出 The contents of the Linked Blocking Queue is : [ A , B , C , D , E ] Yayy! Element C successfully founded in the queue The top element of the queue is : A 3. 删除元素可以使用 remove() 从 LinkedBlockingDeque 中删除元素。take() 和 poll() 等方法也可以用于删除第一个和最后一个元素。 示例 输出 The content of LinkedBlockingDeque is : [ A , B , C , D , E ] The content of the LinkedBlockingDeque after removing elements is : [ A , B , D ] 4. 遍历元素为了遍历“LinkedBlockingDeque”的元素,我们可以创建一个迭代器,并使用 Iterable 接口的方法(它是 Java Collection Framework 的根)来访问元素。Iterable 的“next()”方法返回任何集合的元素。 输出 The content of the Linked Blocking Deque is : A B C D E BlockingQueue 方法
BlockingQueue 方法的行为 BlockingQueue 提供了一些用于对阻塞队列执行插入、删除和检查操作的方法。如果请求的操作未立即满足,四组方法中的每一组都具有不同的行为。
下一个主题Java 中的下一个更大的元素 |
Java 中的流是什么?Java 流提供了一种强大有效的方法来处理元素序列,例如集合。Stream API 于 2015 年首次在 Java 8 中发布,它使程序员能够使用函数式编程方法表达复杂的数据转换和操作。在 Java 中,流是...
7 分钟阅读
在 Java 中,线程是独立的执行单元,可以并发运行,通过利用多个 CPU 核心来提高处理速度。Java 中的线程安全是指程序或代码的属性,无论其数量如何,都能正确处理和执行...
阅读 4 分钟
在 Java 中,ConcurrentModificationException 是一个异常,它告诉我们当其元素正在被并发遍历时,集合在结构上发生了修改。这通常发生在迭代器正在迭代集合时(例如,添加或删除元素)。让...
14 分钟阅读
Java 编程语言允许我们创建不同类型的应用程序,如窗口应用程序或 Web 应用程序。用户界面是在开发应用程序时的一个重要因素。Java 应用程序的 GUI 可以使用 Java 编程中可用的不同颜色进行交互。Java 的图形...
5 分钟阅读
在过去的几年里,Python 取得了巨大的进步。超过八百万开发人员使用 Java 来开发应用程序。这两种语言都能够执行几乎所有的任务。现在,让我们简要介绍这两种语言,然后理解 Python 相对于...
阅读 3 分钟
链表成对交换是指在不改变节点值的情况下交换链表中相邻的节点。目标是重新排列链表,使得每两个连续的节点交换位置,同时保持链表的整体顺序。此操作……
阅读 12 分钟
在 Java Web 开发中,“Handler dispatch failed”错误是在使用 Spring MVC 等 Web 框架时遇到的常见问题。当应用程序的请求处理过程中出现无限循环或递归时,通常会发生此错误,从而导致 java.lang.StackOverflowError。在...
阅读 3 分钟
在本节中,我们将讨论什么是平衡素数以及如何通过 Java 程序找到平衡素数。平衡素数 一个平衡素数是等于其相邻素数的平均值的素数。让我们...
5 分钟阅读
给定一个字符串“str”,我们的任务是通过重新排列给定文本中的字符来创建一个字典序最小的回文串。如果没有这样的字符串,则将返回消息“不存在这样的回文串”。示例 1:输入:字符串 str = "madam" 输出:字典序...
阅读 4 分钟
将类链接在一起是面向对象编程 (OOP) 的关键组成部分,它是一个相互连接的复杂网络。Java 引入了支撑这些交互的三个基本思想,Java 以其面向对象的原则而闻名:关联、聚合和组合。这些概念不仅作为...
阅读 8 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India