您的位置:首页 > 编程语言 > Java开发

Java - 队列

2016-06-30 23:01 281 查看

队列 Queue

队列是一个典型的先进先出(FIFO)的容器.

队列常被当做一种可靠的将对象从程序的一个区域传送到另一个区域的途径.

队列在并发编程中特别重要.

offer()方法将一个元素插入到对位

peek()和element()在不移除的情况下返回队头,当为空时,一个返回null,一个抛出NoSuchElementException

poll()和remove()移除并返回队头,当为空时,一个返回null,一个抛出NoSuchElementException

NameDes
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 顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: