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); // true
System.out.println(BoolB); // true
System.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会被移除,并返回A
System.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()); // 输出A
System.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);
// 安全的写法,如果是空数组,就不会取出来。或者使用peek
if(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()); // A
queue.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 输出的是0
System.out.println(queue.remainingCapacity());
// 获取对队列中的元素数量
int len = queue.size();
System.out.println(len);// 3
//检查队列是否包含指定元素B,包含的话,返回trie
Boolean hasExist =queue.contains("B");
System.out.println(hasExist); // true
// 移除并返回队列头部的元素。如果队列为空,返回 null。
queue.poll();
System.out.println(queue); // [B, C]
// 3-2 = 1
System.out.println(queue.remainingCapacity());
}
}

尾声

准备开始学习java了。

今天学习的第四天,每天都会发文章,我要卷起来。

请小伙伴们监督我,奥利给

java中的ArrayBlockingQueue的更多相关文章

  1. Java中的阻塞队列-ArrayBlockingQueue(一)

    最近在看一些java基础的东西,看到了队列这章,打算对复习的一些知识点做一个笔记,也算是对自己思路的一个整理,本章先聊聊java中的阻塞队列 参考文章: http://ifeve.com/java-b ...

  2. Java中的阻塞队列

    1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用 ...

  3. 聊聊并发(七)——Java中的阻塞队列

    3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...

  4. Java中线程池的学习

    线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程 ...

  5. 面试中关于Java中涉及到知识点(转)

    本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些, ...

  6. java中的各种Queue

    java中的各种并发Queue可以归为以下的几种: ConcurrentLinkedQueue: 一个由链表结构组成的非阻塞队列 ArrayBlockingQueue :一个由数组结构组成的有界阻塞队 ...

  7. 一篇图看清Java中的各种Queue

    说到数据结构,我们大概可以列出这么几个:数组,链表,栈,队列,集合,哈希表. 其中 队列 作为一个常用的数据结构,在Java中也有各种形式的实现. 顶级接口为java.util.queue. java ...

  8. Java中的公平锁和非公平锁实现详解

    前言 Java语言中有许多原生线程安全的数据结构,比如ArrayBlockingQueue.CopyOnWriteArrayList.LinkedBlockingQueue,它们线程安全的实现方式并非 ...

  9. Java 中的锁机制

    多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发(线程安全)问题.解决并发问题可以用锁. java的内置锁: 每个java对象都可以用做一个实现同步的锁,这些锁称为内置锁.线程进入同步 ...

  10. java中使用阻塞队列实现生产这与消费这之间的关系

    需求如下: 有一个生产者和一个消费者,生产者不断的生产产品,消费这不断的消费产品.产品总数为N. 1.生产顺序按队列的方式,先进先出. 2.生产者和消费这可以同时进行. 3.当生产者生产了N个产品后不 ...

随机推荐

  1. ThreeJs-02Threejs开发入门与调试

    这两天没有上传笔记,在解决图床的问题,主打一个白嫖,所以要费点心思,先是用了gitee的图床好不容易配好后发现居然加了防盗链,后面又转了github的咱目前来说github也是最稳定且免费的,现在搞好 ...

  2. 使用sqlparse解析table_name,支持子查询, left join等

    import sqlparse from sqlparse.sql import IdentifierList, Identifier from sqlparse.tokens import Keyw ...

  3. 使用 ibatis 处理复杂对象数据关系的实例

    如何使用 ibatis 处理复杂对象数据关系 iBatis 是一个开源的对象关系映射程序,其工作是将对象映射到 SQL 语句.和其它 O/R Mapping 框架不同,iBatis 开发者需要自己编写 ...

  4. 在vue中使用XLSX导出表格

    安装依赖 npm install file-saver xlsx -S 然后在需要的页面中引入依赖包 import FileSaver from 'file-saver'; import XLSX f ...

  5. PHPstorm配置webserver

    phpstorm自带了一个web server,我们可以直接在IDE中直接运行调试代码,非常方便. 配置interpreter 工程第一次运行还要配置一下php的解释器,我电脑的配置如下: 可以看到代 ...

  6. 轻量虚拟机之Multipass

    官网:https://multipass.run/ 它可以快速在电脑上快速搭建一个轻量级的虚拟机,并且相比于 Vmware 更加轻量,只需一行命令快速创建 Ubuntu 虚拟机. Multipass  ...

  7. springboot 前后端大打包成一个JAR

    1.概述 现在开发使用前后端开发机制,在部署的时候,我们需要将前后端分别打包,使用nginx 进行统一部署.这样就比较复杂,我们可以使用前后端打包到一个jar中,这样我们只需要一个包就可以了. 2.实 ...

  8. uniapp 使用pinpa 持续化更新

    安装依赖 npm i pinia npm i pinia-plugin-persistedstate 新建 index.ts import { createPinia } from 'pinia' i ...

  9. ProWindow的控制按钮状态

    在使用ArcGIS.Desktop.Framework.Controls.ProWindow时,有网友发现,设置窗口调整模式后,窗口的控制按钮是不全的. ProWindow win = new Pro ...

  10. 一套以用户体验出发的.NET8 Web开源框架

    前言 今天大姚给大家分享一套以用户体验出发的.NET8 Web开源框架:YiFramework. 项目介绍 YiFramework是一个基于.NET8 + Abp.vNext + SqlSugar 的 ...