java阻塞的线程安全的优先级队列PriorityBlockingQueue 原创 2022-07-05 14:52:02.0 阅读(1969)次 ### 优先级队列PriorityBlockingQueue - PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,是线程安全的。 - 数组的默认长度是11,虽然指定了数组的长度,但是可以无限的扩充,直到资源消耗尽为止。 - 每次出队都返回优先级别最高的或者最低的元素。 - 默认情况下元素采用自然顺序升序排序,当然我们也可以通过构造函数来指定Comparator来对元素进行排序。 - PriorityBlockingQueue不能保证同优先级元素的顺序。 代码如下: 用户model: ```java public UserInfo(Integer id, String userName, Integer deptId,Integer vipFlag) { super(); this.id = id; this.userName = userName; this.deptId = deptId; this.vipFlag = vipFlag; } ``` ```java import com.mystudy.model.UserInfo; import java.util.Comparator; import java.util.concurrent.PriorityBlockingQueue; /** * @ description: 优先级队列PriorityBlockingQueue: PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,是线程安全的。 数组的默认长度是11,虽然指定了数组的长度,但是可以无限的扩充,直到资源消耗尽为止。 每次出队都返回优先级别最高的或者最低的元素。 默认情况下元素采用自然顺序升序排序,当然我们也可以通过构造函数来指定Comparator来对元素进行排序。 PriorityBlockingQueue不能保证同优先级元素的顺序。 * */ public class PriorityBlockingQueueTest { public static void main(String args[]) throws InterruptedException { //PriorityBlockingQueue queue = new PriorityBlockingQueue(5); System.out.println("=================按人的ID顺办理业务=================="); PriorityBlockingQueue queue = new PriorityBlockingQueue(5, new Comparator() { @Override public int compare(UserInfo o1, UserInfo o2) { return o1.getId()-o2.getId(); } }); queue.add(new UserInfo(3,"小明",1,0)); queue.add(new UserInfo(2,"小杨",1,0)); queue.add(new UserInfo(1,"小张",1,1)); queue.add(new UserInfo(4,"小王",1,1)); while (true){ UserInfo poll = queue.poll(); if(poll == null){ System.out.println("没有人来办理业务,下班!"); break; } String id = poll.getId()+":"; System.out.println(id +poll.getUserName()+"来办理业务啦!"); } System.out.println("=================VIP有优先权办理业务=================="); PriorityBlockingQueue queue2 = new PriorityBlockingQueue(5, new Comparator() { @Override public int compare(UserInfo o1, UserInfo o2) { //vip为1,普通用户为0,所以要降序排序 return o2.getVipFlag() - o1.getVipFlag(); } }); queue2.add(new UserInfo(3,"小明",1,0)); queue2.add(new UserInfo(2,"小杨",1,0)); queue2.add(new UserInfo(1,"小张",1,1)); queue2.add(new UserInfo(4,"小王",1,1)); while (true){ UserInfo poll = queue2.poll(); if(poll == null){ System.out.println("没有人来办理业务,下班!"); break; } String vipStr = poll.getVipFlag() == 1 ? "VIP用户:":"普通用户:"; System.out.println(vipStr+poll.getUserName()+"来办理业务啦!"); } } } ``` 执行结果: ``` =================按人的ID顺办理业务================== 1:小张来办理业务啦! 2:小杨来办理业务啦! 3:小明来办理业务啦! 4:小王来办理业务啦! 没有人来办理业务,下班! =================VIP有优先权办理业务================== VIP用户:小张来办理业务啦! VIP用户:小王来办理业务啦! 普通用户:小明来办理业务啦! 普通用户:小杨来办理业务啦! 没有人来办理业务,下班! ``` java java基础 上一篇:java程序员多线程常见的代码bug 下一篇:获取eureka的注册服务的实例列表
相关文章 java下载图片(976) java List间计算并集、差集、交集以及去重(3832) java程序员多线程常见的代码bug(1657) java使用BufferedImage放大或缩小图片(4643) java Md5工具类获取字符串的Md5值(1265) maven修改jar包版本不生效解决办法(7124) java stream List转Map与List转List与Map转List以及List转Map(8599) java父类转子类报错?怎么办?如何父类转子类(4508) 图片的base64字符转成BufferedImage(2665) java使用guava cache实现本地缓存(4854) 推荐文章 使用spring4实现websocket连接(1) Parameter index out of range (1 > number of parameters, which is 0(7) spring cloud+feign+mybatis中使用seata0.9实现分布式事务(7) spring cloud gateway报错Only one connection receive subscriber allowed(82) spring cloud中Feign调用诡异报错MethodNotAllowed: status 405 reading(116) elasticsearch7.1保存时报错: Validation Failed: 1: type is missing;(7) 聊聊数据保存到MySQL后数据乱码的问题(1) jquery对象与dom对象互转(1) linux使用epel源yum安装iftop、nload、nginx等(2) linux下nginx安装其他模块(1) 热门文章 java stream去重的几种方式(40819) the dependencies of some of the beans in the application context form a cycle(16324) 解决mybatis打印查询结果集造成太多日志的问题(9839) java enum枚举转list和Map(9722) java stream List转Map与List转List与Map转List以及List转Map(8468) ServletRequest转HttpServletRequest设置header之后取不到header的问题(8434) java中BufferedImage转成 base64字符串(8098) 切分List集合为多个List集合(7385) maven修改jar包版本不生效解决办法(6990) bootstrap.yml配置报错:Could not resolve placeholder 'xx' in value (6949) 标签列表 java java java java java java java基础 微服务 异常处理 mysql clickhouse clickhouse clickhouse clickhouse clickhouse spring cloud spring boot linux elasticsearch feign jdbc spring js docker postgresql solr seata nginx maven gateway hsqldb 数据库 架构 大数据分析 分布式事务 redis canal dubbo hadoop 消息队列 win10 websocket springmvc git html select2 mybatis jenkins rocketmq quartz activemq 数据库集群 ajax bat 电脑 笔记 eclipse 设计模式 阿里云 github freemarker jvm jquery javamail redission redission对象 hystrix http hibernate springmail svn ubuntu ueditor xheditor zookeeper 分布式 小程序 开发工具 gitlab