java PriorityBlockingQueue——按优先级排序的阻塞式线程安全列表
来源:互联网 发布:php培训机构排名 编辑:程序博客网 时间:2024/05/21 17:06
java PriorityBlockingQueue——按优先级排序的阻塞式线程安全列表
数据结构应用中的一个经典需求是实现一个有序列表,java引入了priorityBlockingQueue类来满足这类需求。
所有添加进PriorityBlockingQueue的元素必须实现Comparable接口,这个借口提供了CompareTo()方法,他的传入参数是一个同类型的对象。这样就有了两个同类型的对象并且相互比较:其中一个是执行这个方法的对象,另一个是参数传入的对象。这个方法必须返回一个数字值,如果当前对象小于参数传入的对象,那么返回一个小于0的值,如果当前对象大于参数传入的对象,那么返回一个大于0的值;如果两个对象相等就返回0。
当插入元素时,PriorityBlockingQueue使用compareTo()方法来决定插入元素的位置。元素越大越靠后。
PriortyBlockingQueue的另一个重要的特性是,它是阻塞式数据结构(BlockingDataStructure)。当它的方法被调用并且不能立即执行时,调用这个方法的线程将被阻塞直到方法执行成功。
下面这个小例子主要是介绍这个队列的使用和检查队列是否按预期排序,以及在多线程中是怎么使用的。
import java.util.concurrent.PriorityBlockingQueue;public class PriorityBlockingQueueDemo {public static void main(String[] args) {PriorityBlockingQueue<Event> queue = new PriorityBlockingQueue<Event>();Thread[] taskThreads = new Thread[5];for (int i = 0; i < taskThreads.length; i++) {Task task = new Task(i,queue);taskThreads[i] = new Thread(task);}for (int i = 0; i < taskThreads.length; i++) {taskThreads[i].start();}for(int i = 0; i < taskThreads.length; i++) {try {taskThreads[i].join();//等待五个线程执行结束} catch (InterruptedException e) {e.printStackTrace(); }}System.out.printf("Main Queue Size: %d\n", queue.size());for(int i = 0; i < taskThreads.length*200; i++) {Event event = queue.poll();System.out.printf("Thread %s: Priority %d\n",event.getThread(),event.getPriority());}System.out.printf("Main Queue Size: %d\n",queue.size());System.out.printf("Main: End of the program\n");}}class Event implements Comparable<Event> {private int thread;private int priority;public Event(int thread, int priority) {this.thread = thread;this.priority = priority;}public int getThread () {return thread;}public int getPriority() {return priority;}@Overridepublic int compareTo (Event e) {if (this.priority < e.getPriority()) {return -1;} else if (this.priority > e.getPriority()) {return 1;} else {return 0;}}}class Task implements Runnable {private int id;private PriorityBlockingQueue<Event> queue;public Task(int id,PriorityBlockingQueue<Event> queue) {this.id = id;this.queue = queue;}@Override public void run() {for (int i = 0; i < 200; i++) {Event event = new Event(id,i);queue.offer(event);}}}
阅读全文
0 0
- java PriorityBlockingQueue——按优先级排序的阻塞式线程安全列表
- Java并发编程-31-阻塞式优先级列表-PriorityBlockingQueue
- java并发编程第六章(4)使用基于优先级的阻塞式线程安全列表
- 具有优先级的阻塞队列 PriorityBlockingQueue
- 阻塞式线程安全列表
- java PriorityBlockingQueue 基础的优先级队列,可阻塞的读取操作.
- Java并发编程-30-阻塞式线程安全列表-LinkedBlockingDeque
- 五 : PriorityBlockingQueue 优先级阻塞队列
- PriorityBlockingQueue 优先级阻塞队列的介绍和使用
- 非阻塞线程安全列表——ConcurrentLinkedDeque应用举例
- 非阻塞式线程安全列表
- PriorityBlockingQueue的“优先级“
- Java 多线程 优先级队列 PriorityBlockingQueue
- Java并发编程-29-非阻塞式线程安全列表-ConcurrentLinkedDeque
- java并发编程第六章(3)使用阻塞式线程安全列表
- java线程安全之——阻塞锁
- 用PriorityBlockingQueue简化线程优先级调度策略
- java并发实战第六章(2)非阻塞式线程安全列表与一般List集合多线程情况下的比较
- Windows bat复制局域网文件
- java实现邮箱群发功能
- 根据两点的经纬度求方位角和距离
- 模型评估
- ztree树---setting属性
- java PriorityBlockingQueue——按优先级排序的阻塞式线程安全列表
- 并发优化笔记
- 1122. Hamiltonian Cycle (25)
- kafka安装
- popwindow缩放显示消失动画
- PCRE is not compiled with PCRE_UTF8错误
- vueJs(2.x)+router+vuex简易博客系统<一>
- 开发框架-Spring-Spring Boot属性文件及多环境配置
- Linux更改命令提示符信息