队列也是一种数据结构,今天我们主要学习几种基本的队列,然后学习下队列在线程池中的应用。
1. 什么是队列?
队列具有“先进先出,后进后出”的特点。支持操作的也有限,最基本的操作也只有两种:
-
入队enqueue():放一个数据到队列尾部
-
出队dequeue():从队列头部取出一个元素
从上图可以看出,队列和栈一样,都是操作受限的线性表数据结构。
队列作为一种非常基础的数据结构,应用非常广泛,特别是一些具有某些额外特性的队列,比如循环队列、阻塞队列、并发队列。它们在很多底层系统、框架、中间件的开发中,起着非常关键的作用。比如高性能Disruptor、Linux环形缓存等,都用到了循环并发队列;Java concurrent并发包利用ArrayBlockingQueue来实现公平锁等。
2. 顺序队列和链式队列
队列跟栈一样,都可以使用数组和链表来实现。
-
用数组实现的队列叫作顺序队列
-
用链表实现的队列叫作链式队列
顺序队列
// 用数组实现的队列
public class ArrayQueue {
// 数组:items,数组大小:n
private String[] items;
private int n = 0;
// head 表示队头下标,tail 表示队尾下标
private int head = 0;
private int tail = 0;
// 申请一个大小为 capacity 的数组
public ArrayQueue(int capacity) {
items = new String[capacity];
n = capacity;
}
// 入队
public boolean enqueue(String item) {
// 如果 tail == n 表示队列已经满了
if (tail == n) return false;
items[tail] = item;
++tail;
return true;
}
// 出队
public String dequeue() {
// 如果 head == tail 表示队列为空
if (head == tail) return null;
// 为了让其他语言的同学看的更加明确,把 -- 操作放到单独一行来写了
String ret = items[head];
++head;
return ret;
}
}
在栈中,我们只需要一个栈顶指针,但在数列中需要两个指针:
-
head指针:指向队头</