首页 > 其他分享 >BlockingQueue---PriorityBlockingQueue

BlockingQueue---PriorityBlockingQueue

时间:2024-09-19 17:26:14浏览次数:6  
标签:null 优先级 队列 lock --- array PriorityBlockingQueue BlockingQueue

总结

  一个无界的并发队列。

  按照元素的优先级顺序来处理元素。这种队列非常适合需要按照优先级处理任务的场景。

特性

  • 无界:默认情况下是无界的,可以存储任意数量的元素。
  • 基于优先级:队列中的元素根据它们的自然顺序或者由构造时提供的 Comparator 来排序
  • 线程安全:支持多线程同时进行插入和移除操作。
  • 非阻塞插入操作不会被阻塞,即使队列中已经有很多元素;但是取元素的操作可能会被阻塞,如果队列为空。

构造函数

  • PriorityBlockingQueue(): 创建一个默认初始容量为11的 PriorityBlockingQueue
  • PriorityBlockingQueue(int initialCapacity): 创建一个具有指定初始容量的 PriorityBlockingQueue
  • PriorityBlockingQueue(int initialCapacity, Comparator<? super E> comparator): 创建一个具有指定初始容量并使用指定比较器的 PriorityBlockingQueue
  • PriorityBlockingQueue(Collection<? extends E> c): 用给定集合中的元素初始化队列。
  • PriorityBlockingQueue(PriorityBlockingQueue<? extends E> c): 用另一个 PriorityBlockingQueue 初始化当前队列。
  • PriorityBlockingQueue(SortedSet<? extends E> c): 用给定有序集合中的元素初始化队列。

方法

  • 插入操作:

    • put(E e): 将指定的元素插入此优先级队列中。这个方法实际上等同于 offer(E e),因为 PriorityBlockingQueue 是无界的。
    • offer(E e): 将指定的元素插入此优先级队列中。由于队列是无界的,所以总是会成功添加元素。
  • 移除操作:

    • take(): 检索并移除此队列的头最高优先级),如果队列为空,则等待有元素可用。
    • poll(): 检索并移除此队列的头最高优先级),如果队列为空,则立即返回 null
    • poll(long timeout, TimeUnit unit): 检索并移除此队列的头(最高优先级),如果队列为空,则最多等待指定的时间,如果超时队列仍然为空则返回 null
  • 检查操作:

    • peek(): 检索但不移除此队列的头(最高优先级);如果队列为空,则返回 null

 

public class PriorityBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable {
        private static final int DEFAULT_INITIAL_CAPACITY = 11;
        private transient Object[] queue;
        private transient int size;
        private transient Comparator<? super E> comparator;
        private final ReentrantLock lock;

        public PriorityBlockingQueue() {
            this(DEFAULT_INITIAL_CAPACITY, null);
        }

        public PriorityBlockingQueue(int initialCapacity) {
            this(initialCapacity, null);
        }

        public PriorityBlockingQueue(int initialCapacity, Comparator<? super E> comparator) {
            if (initialCapacity < 1)
                throw new IllegalArgumentException();
            this.lock = new ReentrantLock();
            this.notEmpty = lock.newCondition();
            this.comparator = comparator;
            this.queue = new Object[initialCapacity];
        }

        // 插入指定元素到优先级队列
        public boolean offer(E e) {
            if (e == null)
                throw new NullPointerException();
            final ReentrantLock lock = this.lock;
            lock.lock();
            int n, cap;
            Object[] array;
            while ((n = size) >= (cap = (array = queue).length))
                tryGrow(array, cap);
            try {
                Comparator<? super E> cmp = comparator;
                if (cmp == null)                                        //
                    siftUpComparable(n, e, array);
                else
                    siftUpUsingComparator(n, e, array, cmp);
                size = n + 1;
                notEmpty.signal();
            } finally {
                lock.unlock();
            }
            return true;
        }

        public E poll() {
            final ReentrantLock lock = this.lock;
            lock.lock();
            try {
                return dequeue();
            } finally {
                lock.unlock();
            }
        }

        private E dequeue() {
            int n = size - 1;
            if (n < 0)
                return null;
            else {
                Object[] array = queue;
                E result = (E) array[0];
                E x = (E) array[n];
                array[n] = null;
                Comparator<? super E> cmp = comparator;
                if (cmp == null)
                    siftDownComparable(0, x, array, n);
                else
                    siftDownUsingComparator(0, x, array, n, cmp);
                size = n;
                return result;
            }
        }
    }

  

  

标签:null,优先级,队列,lock,---,array,PriorityBlockingQueue,BlockingQueue
From: https://www.cnblogs.com/anpeiyong/p/18421008

相关文章

  • mybatis-plus 条件参数说明
     //条件构造器1@TestpublicvoidtestFindWrapper1(){//查询年龄小于25或年龄大于30的人QueryWrapper<Student>queryWrapper=newQueryWrapper<>();queryWrapper.lt("age",25).or().gt("age",30);List<Student>students=studentMapp......
  • 信息学奥赛初赛天天练-92-CSP-S2023阅读程序2-动态数组、反转函数、埃氏筛法、欧拉筛
    2023CSP-S阅读程序2判断题正确填√,错误填⨉;除特殊说明外,判断题1.5分,选择题3分,共计40分)01#include<iostream>02#include<cmath>03#include<vector>04#include<algorithm>05usingnamespacestd;0607longlongsolve1(intn){08vector<boo......
  • GBase 8c 兼容性-oracle分区语法
    GBase8c分布式版本支持兼容oracle分区表功能,支持二级分区,9种分区组合,interval分区。分区明显如下:hash分区sql示例,与oracle写法一致。--一级hash分区droptableifexistsmea_hashcascade;createtablemea_hash(city_idint,logdatetimestamp,idint)partition......
  • 手机实时提取SIM卡打电话的信令和声音-新的方案-开篇
    手机实时提取SIM卡打电话的信令和声音-新的方案-开篇继上一篇《手机实时提取SIM卡打电话的信令和声音-(五、最终解决方案-智能拨号器方案》之后,至今,又过去了一年。这期间收到过一些用户和朋友的反馈,列举了一些蓝牙方案的电话在使用上的问题,大致总结如下:需要另外购买蓝牙模块......
  • ”破读“ - 古汉语中名词作动词的音调变化
    在古汉语中,动词读去声的情况通常出现在名词用作动词,或者某些及物动词在使动用法的情况下。这种现象被称为“破读”或“读破”,其中名词用作动词的破读尤为常见。具体来说,这种读音的变化体现了古汉语中词类的活用和语法的变化。‌名词用作动词的破读‌:例如,“王”字在古文中通常作......
  • 【论文阅读笔记】【Hand Pose Estimation-Interacting Hand】 Interacting Two-Hand 3
    ICCV2021读论文思考的问题论文试图解决什么问题?写作背景是什么?问题:如何针对性解决双手手势识别里出现的重度遮挡以及深度交互的问题?背景:由于严重的遮挡和交互特点,先前针对单手手势识别设计的模型不能很好地应用到双手的情景中文章提出了什么样的解决方法?提出......
  • MySQL零基础入门教程-1 mysql安装卸载、启动关闭、常用命令、sql语句分类(非常详细),基础
    教程来源:B站视频BV1Vy4y1z7EX001-数据库概述_哔哩哔哩_bilibili我自己听讲收集整理的课程的完整笔记,供大家学习交流吧:夸克网盘分享本文内容为完整笔记的第一篇一、数据库概述1、什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?P1、P2数据库英文单词DataBase,简称DB,......
  • SSM大学生就业平台-计算机毕业设计源码85751
    目录1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2系统分析2.1可行性分析2.1.1技术可行性2.1.2经济可行性2.1.3社会可行性2.2系统流程分析2.2.1系统开发流程2.2.2用户登录流程2.2.3系统操作流程2.2.4添加信息流程2.2.5......
  • whiz学习资料汇总 - 终端命令行助手工具Whiz安装使用方法隐私贡献Github开源项目
    whiz学习资料汇总-终端命令行助手工具whiz是一个基于人工智能的终端命令行助手工具,可以帮助用户更高效地使用命令行。本文汇总了whiz的相关学习资料,帮助读者快速上手和深入了解这个强大的工具。1.安装方法可以通过npm安装whiz:npminstall-gwhiz_cli安装完成后,......
  • EvalGPT学习资料汇总 - 基于大语言模型的代码解释器框架
    EvalGPT简介EvalGPT是一个基于大语言模型的代码解释器框架,它能够自动化代码编写和执行过程,为用户定义的任务提供精确结果。该框架利用GPT-4、CodeLlama和Claude2等先进的大语言模型,让用户只需描述任务,EvalGPT就能协助编写代码、执行代码并交付结果。核心特性自动化代码编......