Java - 队列
2016-06-30 23:01
281 查看
队列 Queue
队列是一个典型的先进先出(FIFO)的容器.队列常被当做一种可靠的将对象从程序的一个区域传送到另一个区域的途径.
队列在并发编程中特别重要.
offer()方法将一个元素插入到对位
peek()和element()在不移除的情况下返回队头,当为空时,一个返回null,一个抛出NoSuchElementException
poll()和remove()移除并返回队头,当为空时,一个返回null,一个抛出NoSuchElementException
Name | Des |
---|---|
LinkedList | 普通队列 |
PriorityQueue | 优先级队列 |
ArrayBlockingQueue | 基于数组的并发阻塞队列 |
ConcurrentLinkedQueue | 基于链表的并发队列 |
LinkedBlockingQueue | 基于链表的FIFO阻塞队列 |
PriorityBlockingQueue | 带优先级的无界阻塞队列 |
ArrayDeque | 数组双端队列 |
DelayQueue, | 延期阻塞队列, 阻塞队列实现了BlockingQueue接口 |
LinkedBlockingDeque | 基于链表的FIFO双端阻塞队列 |
SynchronousQueue | 并发同步阻塞队列 |
PriorityQueue
先进先出描述了最典型的队列规则.队列规则是指在给定一个组队列中的元素情况下,确定下一个弹出队列的元素的规则.先进先出声明的是下一个元素应该是等待时间更长的元素.
优先级队列声明下一个弹出元素是最需要的元素(具有最高优先级),一般通过Comparator实现优先级比较.
ProrityQueue中的offer()方法插入一个对象时,对象会在队列中被排序,默认的排序是使用对象在队列中的自然顺序,但是可以通过提供一个Comparator来修改这个顺序.
当调用peek()时获取的元素是优先级最高的.
Code
public class ToDoList extends PriorityQueue<ToDoList.ToDoItem> { static class ToDoItem implements Comparable<ToDoItem> { private char primary; private int secondary; private String item; public ToDoItem(char primary, int secondary, String item) { this.primary = primary; this.secondary = secondary; this.item = item; } @Override public int compareTo(ToDoItem o) { if (primary > o.primary) { return 1; } if (primary == o.primary) { if (secondary > o.secondary) { return 1; } else if (secondary == o.secondary) { return 0; } } return -1; } @Override public String toString() { return Character.toString(primary) + secondary + " : " + item; } } public void add(String id, char pri, int sec) { super.add(new ToDoItem(pri, sec, id)); } public static void main(String[] args) { ToDoList toDoItems = new ToDoList(); toDoItems.add("Empty trash", 'C', 4); toDoItems.add("Feed dog", 'A', 2); toDoItems.add("Feed bird", 'B', 7); toDoItems.add("Mow lawn", 'C', 3); toDoItems.add("Water lawn", 'A', 1); toDoItems.add("Feed cat", 'B', 1); while (!toDoItems.isEmpty()) { System.out.println(toDoItems.remove()); } } }
Result
A1 : Water lawn A2 : Feed dog B1 : Feed cat B7 : Feed bird C3 : Mow lawn C4 : Empty trash
ArrayBlockQueue
是一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素。这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。
此类支持对等待的生产者线程和消费者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。然而,通过将公平性 (fairness) 设置为 true 而构造的队列允许按照 FIFO 顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”。
相关文章推荐
- 今天学习体悟java
- [转载]JMeter源码导入Eclipse
- Java Servlet完全教程
- struts2的介绍和搭建struts2环境
- Java中对于所有对象都通用的方法之——equals
- JavaSE复习_10 多线程复习
- 经验总结:Struts2原理与简单配置
- java运算符
- java项目——P2B理财之资金托管(1)
- 一道关于多态题目的解析
- java强制转换
- Java解析采集模块
- java数据类型转换默认转换
- java基本数据类型
- java多任务并发处理--Callable<?>
- Eclipse中怎么清除EGit记住的GitHub用户名和密码
- 10.Java 集合 - WeakHashMap
- Spring常用注解
- java常量
- Spring +Mybatis 拦截器配置