并发编程-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
并发编程-concurrent指南-阻塞队列-优先级的阻塞队列PriorityBlockingQueue的更多相关文章
- 并发编程-concurrent指南-阻塞双端队列-链阻塞双端队列LinkedBlockingDeque
LinkedBlockingDeque是双向链表实现的阻塞队列.该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除): 在不能够插入元素时,它将阻塞住试图插入元 ...
- 并发编程-concurrent指南-阻塞队列-数组阻塞队列ArrayBlockingQueue
ArrayBlockingQueue类是实现了BlockingQueue. ArrayBlockingQueue是一个有界的阻塞队列,其内部实现是将对象放在一个数组中. 放入元素方法: (1) add ...
- 并发编程-concurrent指南-阻塞队列-同步队列SynchronousQueue
SynchronousQueue:同步Queue,属于线程安全的BlockingQueue的一种,此队列设计的理念类似于"单工模式",对于每个put/offer操作,必须等待一个t ...
- 并发编程-concurrent指南-原子操作类-AtomicInteger
在java并发编程中,会出现++,--等操作,但是这些不是原子性操作,这在线程安全上面就会出现相应的问题.因此java提供了相应类的原子性操作类. 1.AtomicInteger
- 并发编程-concurrent指南-阻塞队列-链表阻塞队列LinkedBlockingQueue
LinkedBlockingQueue是一个基于链表的阻塞队列. 由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选. LinkedBlocki ...
- 并发编程-concurrent指南-阻塞队列BlockingQueue
阻塞队列BlockingQueue,java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列. 适用场景: BlockingQueue通常用于一个线程 ...
- 并发编程-concurrent指南-阻塞双端队列BlockingDeque
java.util.concurrent 包里的 BlockingDeque 接口表示一个线程安放入和提取实例的双端队列. BlockingDeque 类是一个双端队列,在不能够插入元素时,它将阻塞住 ...
- 并发编程-concurrent指南-阻塞队列-延迟队列DelayQueue
DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走.这种队列是有序的,即队头对象的延迟到期时间最长.注意:不能 ...
- 深入理解java:2.3.5. 并发编程concurrent包 之容器BlockingQueue(阻塞队列)
1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列. 这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空. 当队列满时,存储元素的线程会等待队列 ...
随机推荐
- duilib拖动控制功能的实现(源代码)
转载请注明原始出处.谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41144283 duilib库中原本没有显示的对控件添加拖拽的功能.而实 ...
- 给CentOS 6安装Tomcat 7,从一开始
由于给企业培训以及前面几年使用PHP太多了,这次server逐步转为使用JavaEE来搭建. 下载的JDK 7.8已经出来了,可是不太熟悉,所以还是下载7版本号.这里怎样安装JDK7不讲了. 当前最新 ...
- Command 传参的几种方式
Command可以根据CommandParameter传参 关键代码 public ICommand SubmitCommand => _submitCommand; private Relay ...
- 合并 && 还原属性链
效果 原数据 { "id": 10, "text": { "title": "title", "content ...
- XF 列表视图事件
<?xml version="1.0" encoding="utf-8" ?><ContentPage xmlns="http:// ...
- C#(WPF)为Grid添加实线边框。
原文:C#(WPF)为Grid添加实线边框. 相信大家在做WPF项目的时候,都会用到Grid这个布局控件,一般情况下,如果只是为了布局,那就不需要显示它的边框,但是也有特殊需求,如果把它当做表格来使用 ...
- js 超链接点击
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- Java CLASSPATH 引发的问题
# 问题 在做 OJ 的时候,由于程序需要编译运行,出于安全性考虑,我选择利用类 ProcessBuilder ,一个通过命令行调用 Java 程序的类. 我在 Eclipse 中或者在 CMD 中执 ...
- Qt中嵌入Directx11(有句柄就可以)
最近要做个游戏场景编辑器,需要directx11配合gui框架使用,所以简单地弄了一个directx11嵌入到Qt窗体中的程序. 1 建立工程 建一个Qt的工程,配置好directx的包含目录和库目录 ...
- 【Android】解决微信调起支付接口没反应,调不起来微信的问题
原文:[Android]解决微信调起支付接口没反应,调不起来微信的问题 //#前言 吐槽一下,微信支付的sdk真难用,文档混乱,坑不少. 正文:可能引起这种情况的问题 1. 最不能出现的 你的APPI ...