java中的ArrayBlockingQueue

news/2025/1/31 10:45:43/文章来源:https://www.cnblogs.com/ishoulgodo/p/18695658

ArrayBlockingQueue

ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个线程安全的阻塞队列实现。
它基于数组实现,容量固定,支持先进先出的顺序。
Array Blocking Queue 数组阻塞队列 读音: [əˈreɪ] [ˈblɒkɪŋ] [kjuː]
concurrent 同时发生的 /kənˈkʌrənt/
peek 偷看;窥视 /piːk/

ArrayBlockingQueue的常见方法

添加元素
1,boolean add(E e)将元素添加到队列尾部。如果队列已满,抛出异常。返回值是布尔类型
2,boolean offer(E e)将元素添加到队列尾部。如果队列已满,返回 false。返回值是布尔类型[常用]
3, void put(E e)将元素添加到队列尾部。如果队列已满,会造成阻塞,最好抛出异常
移除元素
1,E remove()移除并返回队列头部的元素。如果队列为空,抛出 NoSuchElementException,最好抛出异常。
2,E poll()移除并返回队列头部的元素。如果队列为空,返回 null[常用]
3,E take()移除并返回队列头部的元素。如果队列为空,就会造成阻塞。最好抛出异常,take必须放置在try-catch中,否则会在编译的时不会通过。
查看元素
1,E element()返回队列头部的元素(不移除)。如果队列为空,抛出 NoSuchElementException。
2,E peek()返回队列头部的元素(不移除)。如果队列为空,返回 null[常用]
其他方法
1,int size()返回队列中的元素数量。
2,int remainingCapacity()返回队列剩余的容量。
3,boolean contains(Object o)检查队列是否包含指定元素。
4,void clear()清空队列中的所有元素。
5,Object[] toArray()将队列转换为数组。
ps: E 表示泛型

ArrayBlockingQueue.add 添加元素

ArrayBlockingQueue.add 添加数据的时候。
如果添加的长度已经大于了设置的长度。
在程序运行的时候会报错 Queue full 队列已满

package part;
// 在util->concurrent包下
import java.util.concurrent.ArrayBlockingQueue;public class Java01 {public static void main(String[] args) {ArrayBlockingQueue queue = new ArrayBlockingQueue(3);queue.add("张三");queue.add("李四");queue.add("wangwu");queue.add("赵六");// 会出现报错,Queue full 队列已满System.out.println(queue);}
}

ArrayBlockingQueue.put 添加元素,超出设置的长度会造成阻塞

我们设置ArrayBlockingQueue的长度是3
当我们添加数据的长度大于3的时候
程序是会出现错误:编译不会通过,使用异常捕获后,还是会造成阻塞
挂号:赵六 输不出来


package part;
// 在util->concurrent包下
import java.util.concurrent.ArrayBlockingQueue;
public class Java01 {public static void main(String[] args) {ArrayBlockingQueue queue = new ArrayBlockingQueue(3);try{queue.put("张三");System.out.println("挂号:张三");queue.put("李四");System.out.println("挂号:李四");queue.put("wangwu");System.out.println("挂号:wangwu");queue.put("赵六");System.out.println("挂号:赵六");System.out.println(queue);}catch (Exception e){e.printStackTrace();}}
}

ArrayBlockingQueue.offer 添加元素

ArrayBlockingQueue.offer 也是新增数据的。
它的返回值是布尔值。
如果放入进去了。返回true,没有放进去,返回false。

package part;
// 在util->concurrent包下
import java.util.concurrent.ArrayBlockingQueue;
public class Java01 {public static void main(String[] args) {ArrayBlockingQueue queue = new ArrayBlockingQueue(2);Boolean BoolA= queue.offer("A");Boolean BoolB= queue.offer("B");Boolean BoolC= queue.offer("C");System.out.println(BoolA); // trueSystem.out.println(BoolB); // trueSystem.out.println(BoolC); // false}
}

ArrayBlockingQueue.poll()

ArrayBlockingQueue.poll() 移除并返回队列头部的元素。如果队列为空,返回 null。


public class Java01 {public static void main(String[] args) {ArrayBlockingQueue queue = new ArrayBlockingQueue(3);Boolean BoolA= queue.offer("A");Boolean BoolB= queue.offer("B");Boolean BoolC= queue.offer("C");// [A, B, C]System.out.println(queue);// poll: 移除并返回队列头部的元素。如果队列为空,返回 null。// 队列头部的元素是A,因此A会被移除,并返回ASystem.out.println( queue.poll()); // 输出的是 A// [B, C]System.out.println(queue);}
}

ArrayBlockingQueue.remove()移除并返回队列头部的元素

E ArrayBlockingQueue.remove()移除并返回队列头部的元素。
如果队列为空,抛出 NoSuchElementException,最好抛出异常。

package part;
// 在util->concurrent包下
import java.util.concurrent.ArrayBlockingQueue;
public class Java01 {public static void main(String[] args) {ArrayBlockingQueue queue = new ArrayBlockingQueue(3);Boolean BoolA= queue.offer("A");Boolean BoolB= queue.offer("B");Boolean BoolC= queue.offer("C");// [A, B, C]System.out.println(queue);System.out.println( queue.remove());System.out.println( queue.remove());System.out.println( queue.remove());// 报错 Exception in thread "main" java.util.NoSuchElementException// 因为:此时队列已经是空(空数组)在移除就会报错了System.out.println(queue.remove());}
}

take()移除并返回队列头部的元素。如果队列为空,就会造成阻塞。

E ArrayBlockingQueue.take()移除并返回队列头部的元素。
如果队列为空,就会造成阻塞。
最好抛出异常,take必须放置在try-catch中,否则会在编译的时不会通过。

package part;
// 在util->concurrent包下
import java.util.concurrent.ArrayBlockingQueue;
public class Java01 {public static void main(String[] args) {ArrayBlockingQueue queue = new ArrayBlockingQueue(3);Boolean BoolA= queue.offer("A");Boolean BoolB= queue.offer("B");Boolean BoolC= queue.offer("C");// [A, B, C]System.out.println(queue);try{System.out.println( queue.take());System.out.println( queue.take());System.out.println( queue.take());// take必须放置在try-catch中,否则会在编译的时不会通过。// 如果队列为空,就会造成阻塞。System.out.println(queue.take());}catch (Exception e){System.out.println(e);}}
}

element返回队列头部的元素(不移除)如果队列为空,抛出异常。

E element()返回队列头部的元素(不移除)。如果队列为空,抛出 NoSuchElementException。


package part;
// 在util->concurrent包下
import java.util.concurrent.ArrayBlockingQueue;
public class Java01 {public static void main(String[] args) throws InterruptedException {ArrayBlockingQueue queue = new ArrayBlockingQueue(3);Boolean BoolA= queue.offer("A");Boolean BoolB= queue.offer("B");Boolean BoolC= queue.offer("C");// [A, B, C]System.out.println(queue);System.out.println(queue.element()); // 输出ASystem.out.println(queue.element()); // 输出A}
}
package part;
// 在util->concurrent包下
import java.util.concurrent.ArrayBlockingQueue;
public class Java01 {public static void main(String[] args) throws InterruptedException {ArrayBlockingQueue queue = new ArrayBlockingQueue(3);Boolean BoolA= queue.offer("A");Boolean BoolB= queue.offer("B");Boolean BoolC= queue.offer("C");// 清空queue.clear();// 输出 []System.out.println(queue);// 报错,因为:如果队列为空,抛出 NoSuchElementException。System.out.println(queue.element());}
}

使用queue.element()安全的写法


package part;
// 在util->concurrent包下
import java.util.concurrent.ArrayBlockingQueue;public class Java01 {public static void main(String[] args) throws InterruptedException {ArrayBlockingQueue queue = new ArrayBlockingQueue(3);Boolean BoolA= queue.offer("A");Boolean BoolB= queue.offer("B");Boolean BoolC= queue.offer("C");// 清空queue.clear();// 输出 []System.out.println(queue);// 安全的写法,如果是空数组,就不会取出来。或者使用peekif(queue.size() >0){System.out.println(queue.element());}}
}

使用 peek() 返回队列头部的元素(不移除)。如果队列为空,返回 null。

package part;
// 在util->concurrent包下
import java.util.concurrent.ArrayBlockingQueue;public class Java01 {public static void main(String[] args) throws InterruptedException {ArrayBlockingQueue queue = new ArrayBlockingQueue(3);Boolean BoolA= queue.offer("A");Boolean BoolB= queue.offer("B");Boolean BoolC= queue.offer("C");System.out.println(queue.peek()); // Aqueue.clear();System.out.println(queue.peek()); // null}
}

remainingCapacity方法返回的值返回队列剩余的容量

remainingCapacity() 方法返回的值返回队列剩余的容量。具体来说:
如果队列是空的,返回值是初始容量减去当前队列中元素的数量
如果队列已经满了,返回的剩余容量将为0。
在其他情况下,返回的剩余容量将是初始容量减去当前队列中元素的数量。

package part;
// 在util->concurrent包下
import java.util.concurrent.ArrayBlockingQueue;
public class Java01 {public static void main(String[] args) throws InterruptedException {ArrayBlockingQueue queue = new ArrayBlockingQueue(3);Boolean BoolA= queue.offer("A");Boolean BoolB= queue.offer("B");Boolean BoolC= queue.offer("C");// 3-3 =0 输出的是0System.out.println(queue.remainingCapacity());// 获取对队列中的元素数量int len = queue.size();System.out.println(len);// 3//检查队列是否包含指定元素B,包含的话,返回trieBoolean hasExist =queue.contains("B");System.out.println(hasExist); // true//  移除并返回队列头部的元素。如果队列为空,返回 null。queue.poll();System.out.println(queue);  // [B, C]// 3-2 = 1System.out.println(queue.remainingCapacity());}
}

尾声

准备开始学习java了。
今天学习的第四天,每天都会发文章,我要卷起来。
请小伙伴们监督我,奥利给

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877243.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五. Redis 配置内容(详细配置说明)

五. Redis 配置内容(详细配置说明) @目录五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置4…

一文搞懂编程在开源软件运动中的应用

一文搞懂编程在开源软件运动中的应用一文搞懂编程在开源软件运动中的应用一理解开源软件运动文本内容开源软…………```HTML一文搞懂编程在开源软件运动中的应用一、理解开源软件运动:<!DOCTYPE html><html><head><meta charset="UTF-8"> &…

makefile在编译后输出STM32的Flash RAM占用情况的方法

本文介绍了在用makefile组织的STM32工程中,怎么在编译完成后计算并显示Flash和RAM占用情况的方法。知乎 - STM32 GCC工程编译后输出FLASH RAM使用占比的方法 里面这个方法看得我血压飙升,本身代码很不直观,写起来要反斜杠,还留了两行没用的代码,还有各种依赖命令,subst和…

您的干净代码可能是别人的技术债务

您的干净代码可能是别人的技术债务 为什么软件模式必须适应团队规模,以及如何正确操作。 大卫罗德纳斯 博士由作者生成 在软件开发中,我们面临着一个奇怪的悖论:对于一个团队来说,使代码更干净、更易维护、更优雅的架构决策,可能会让另一个团队觉得更复杂、更僵化、更麻烦…

读算法简史:从美索不达米亚到人工智能时代02古老的算法

苏美尔文字起源于湿黏土陶筹,楔形文字记录了苏美尔语,促进社会发展。阿卡德、巴比伦帝国相继统治,文字变迁。19世纪欧洲考古学家破译文字。美索不达米亚算法复杂,包括六十进制和毕达哥拉斯定理。埃及数学留存少,欧几里得算法著名。1. 苏美尔 1.1. 位于苏美尔地区的乌鲁克,…

计量经济学——空间计量概述(十八)

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 空间计量经济学(Spatial Econometrics)创新性地解决了经典计量方法在空间数据分析中的局限性,研究地理观测值之间的相互关系。近年来,在人文社会科学的“…

经济经济学——空间计量概述(十八)

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 空间计量经济学(Spatial Econometrics)创新性地解决了经典计量方法在空间数据分析中的局限性,研究地理观测值之间的相互关系。近年来,在人文社会科学的“…

Cisco NX-OS System Software - ACI 16.1(2g)F - 适用于 ACI 模式下的 Nexus 9000 系列交换机系统软件

Cisco NX-OS System Software - ACI 16.1(2g)F - 适用于 ACI 模式下的 Nexus 9000 系列交换机系统软件Cisco NX-OS System Software - ACI 16.1(2g)F 适用于 ACI 模式下的 Cisco Nexus 9000 系列交换机系统软件 请访问原文链接:https://sysin.org/blog/cisco-aci-16/ 查看最新…

Cisco APIC 6.1(2g)F - 应用策略基础设施控制器

Cisco APIC 6.1(2g)F - 应用策略基础设施控制器Cisco APIC 6.1(2g)F - 应用策略基础设施控制器 Application Policy Infrastructure Controller (APIC) 请访问原文链接:https://sysin.org/blog/cisco-apic-6/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org思科…

Python多线程爬取亚马逊商品数据

前言 新年快乐 1.环境准备 使用miniconda为亚马逊创建一个新环境,防止feapder和其他包冲突(比如scrapy)。 # 创建一个新的 Conda 环境: conda create -n python_feapder python=3.12# 查看已创建的环境 conda info --envs# 激活环境 conda activate python_feapder# 安装所…

Debug: debugger失效排查

MarkTime: 2024-11-24 19:25:17 LogTime: 2024-11-24 19:25:17记一次 debugger 断点失效原因的排查版本说明Chrome: 131.0.6778.86 Vue: 3.2.27结论检查 是否启用了 谷歌浏览器 的 自定义排除规则, 并把 node_modules 给排除了 检查 前端项目配置文件eslint 是否有覆盖规则, 使…

Debug: 前端发送请求参数传递null, 后端转换实体类对应变量自动注入默认值

MarkTime: 2024-11-18 16:19:47 LogTime: 2024-11-25 01:26:05实体类属性未正确定义原因导致: ​ 基础数据类型未被初始化, 会对对应变量赋予默认值(int: 0; boolean: false;...) ​ 包装类型允许存储null, 不会进行默认值赋予, 实体类中如果需要设置默认值需要自行指定(privat…