• 并发编程-concurrent指南-阻塞队列-优先级的阻塞队列PriorityBlockingQueue


    PriorityBlockingQueue是一个支持优先级的无界阻塞队列

    它使用了和类 java.util.PriorityQueue 一样的排序规则。你无法向这个队列中插入 null 值。

    所有插入到 PriorityBlockingQueue 的元素必须实现 java.lang.Comparable 接口。因此该队列中元素的排序就取决于你自己的 Comparable 实现

    PriorityBlockingQueue 对于具有相等优先级(compare() == 0)的元素并不强制任何特定行为。

    如果你从一个 PriorityBlockingQueue 获得一个 Iterator 的话,该 Iterator 并不能保证它对元素的遍历是以优先级为序的。

    由于PriorityBlockingQueue是无界队列,因而使用put方法并不会阻塞,offer方法不会返回false。

    PriorityBlockingQueue也是基于最小二叉堆实现

    具体代码:

    public class User implements Comparable<User>{
        private String name;
        private int age;
    
        public User(String name,int age){
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public int compareTo(User o) {
            //年龄最小在队列尾部,依次排序
            return this.age -o.age;
        }
    }
    import java.util.concurrent.PriorityBlockingQueue;
    
    public class Main {
        public static void main(String[] args) throws InterruptedException {
            //声明队列,这个是一个无界队列,所以用的时候需要谨慎
            PriorityBlockingQueue<User> priorityBlockingQueue = new PriorityBlockingQueue<User>();
    
            priorityBlockingQueue.put(new User("张三",20));
            priorityBlockingQueue.put(new User("李四",30));
            priorityBlockingQueue.put(new User("王二",24));
            priorityBlockingQueue.put(new User("刘一",27));
            priorityBlockingQueue.put(new User("麻子",21));
    
            //
            while(true){
                User user = priorityBlockingQueue.take();
                System.out.println(user.getName()+","+user.getAge());
            }
        }
    }

    结果:

    张三,20
    麻子,21
    王二,24
    刘一,27
    李四,30

    源码地址:https://github.com/qjm201000/concurrent_priorityBlockingQueue.git

  • 相关阅读:
    MacOS下免密码ssh登陆
    七种网卡绑定模式详解
    dnsmasq一次成功的配置
    ceph存储引擎bluestore解析
    关于并发你真的了解吗?
    Web大规模高并发请求和抢购的解决方案
    centos6.6配置rsync+sersync实现实时同步分布式多客户端分发同步
    TCP慢启动,拥塞控制,ECN 笔记
    MFS文件系统的组成
    CentOS 6.5安装部署Zabbix监控系统
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10144547.html
Copyright © 2020-2023  润新知