并发之PriorityBlockingQueue简单使用

2024-06-20 03:48

本文主要是介绍并发之PriorityBlockingQueue简单使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PriorityBlockingQueue是一个支持优先级的无界阻塞队列,直到系统资源耗尽。默认情况下元素采用自然顺序升序排列。也可以自定义类实现compareTo()方法来指定元素排序规则,或者初始化PriorityBlockingQueue时,指定构造参数Comparator来对元素进行排序。但需要注意的是不能保证同优先级元素的顺序。PriorityBlockingQueue也是基于最小二叉堆实现,使用基于CAS实现的自旋锁来控制队列的动态扩容,保证了扩容操作不会阻塞take操作的执行

实现类需要自己实现一个继承了 Comparator 接口的类, 在插入资源时会按照自定义的排序规则来对资源数组进行排序。 其中值大的排在数组后面 ,取值时从数组投开始取


/*** 生产者**/
public class ExBean implements Comparable<ExBean> {int id;String name;public String getName() {return name;}public int getId() {return id;}public void setName(String name) {this.name = name;}public void setId(int id) {this.id = id;}public ExBean(int id,String name) {this.name = name;this.id = id;}@Overridepublic int compareTo(ExBean exBean) {return this.id - exBean.getId();}@Overridepublic String toString() {return "ExBean{" +"id=" + id +", name='" + name + '\'' +'}';}
}

PriorityBlockingQueue有四个构造方法:

  1. public PriorityBlockingQueue()
  2. public PriorityBlockingQueue(int initialCapacity)//
    根据initialCapacity来设置队列的初始容量
  3. public PriorityBlockingQueue(int initialCapacity, Comparator<? super
    E> comparator)// 根据initialCapacity来设置队列的初始容量,并根据comparator对象来对数据进行排序
  4. public PriorityBlockingQueue(Collection<? extends E> c)// 根据集合来创建队列

常用的添加元素函数

  1. add():若超出了度列的长度会直接抛出异常:
  2. put():若向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间,以加入元素。
  3. offer():如果发现队列已满无法添加的话,会直接返回false。

从队列中取出并移除头元素的方法

  1. poll():若队列为空,返回null。
  2. remove():若队列为空,抛出NoSuchElementException异常。
  3. take():若队列为空,发生阻塞,等待有元素。

返回队列头列表

  1. element():返回队列头元素,如果为空则抛出异常NoSuchEleMentException
  2. peek():返回队列头元素,如果为空则返回null

ExQueueManager.class

public class ExQueueManager {private static ExQueueManager manager;private PriorityBlockingQueue<Object> queue ;private ExQueueManager(){queue = new PriorityBlockingQueue();}public static ExQueueManager getInstance(){if (null==manager){synchronized (ExQueueManager.class){if (null==manager){manager = new ExQueueManager();}}}return manager ;}/*** 添加** @param t* @param <T>*/public <T extends Comparable> void add(T t){queue.add(t);}/*** 取出*/public <T extends Comparable> T take(){try {if (!queue.isEmpty()){return (T) queue.take();}} catch (InterruptedException e) {e.printStackTrace();}return null ;}public boolean isEmpty(){return queue.isEmpty();}}

消费者


/*** 消費者*/
public class ExQueueThread extends Thread {@Overridepublic void run() {super.run();try {while (!ExQueueManager.getInstance().isEmpty()){/*同时取三个 用来消费*/ExBean t = ExQueueManager.getInstance().take();ExBean t1 = ExQueueManager.getInstance().take();ExBean t2 = ExQueueManager.getInstance().take();Thread.sleep(3000);Log.v("tag","[ExBean]->"+t.toString());Log.v("tag","[ExBean]->"+t1.toString());Log.v("tag","[ExBean]->"+t2.toString());}} catch (InterruptedException e) {e.printStackTrace();}}
}

测试结果

    private void initQueue() {for (int i=0;i<10;i++){ExQueueManager.getInstance().add(new ExBean(i,"公司大發噶的風格 i="+i));}new ExQueueThread().start();}

在这里插入图片描述

这篇关于并发之PriorityBlockingQueue简单使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077011

相关文章

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边