队列介绍
今天要来讲一下java里的队列,队列,顾名思义,排队的列,既然按排队形来做的话,生活中的银行排队啊,上车排队啊,都是先到先办理或者先上车,队列存取数据列也一样,这就是先进先出,使用队列的规则是:使用队素时,数据元素只能从表的一端进入队列,另一端出队列。
称进入队列的一端为“队尾”,出队列的一端为“队头”。数据元素全部从队尾陆续进队列,由对头陆续出队列。
特点:先进先出
效率:插入数据项和移除数据项的时间复杂度都是O(1),因为插入是一个一个而且只能在一端插入,取出也只能一个一个从一头取,这样不用循环一次取一次存就可以得到复杂度就是O(1)。
2.java的阻塞队列
2.1 ArrayBlockingQueue
基于数组实现的一个有界的阻塞队列,在创建ArrayBlockingQueue对象时必须指定容器大小。并且可以指定公平性和非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列。
为什么是有界的?
看下图不指定容量会报错,那么指定了容量就是有界的。
为什么可以支持公平锁和非公平锁?
我随便拿个示例调用一个队列里的一个方法点进去
用的是ReentrantLock,ReentrantLock本身的功能是有支持公平锁和非公平锁的
下面代码示例下ArrayBlockingQueue怎么使用?
因为ArrayBlockingQueue存储和移除数据有三种情况,异常,阻塞,非阻塞
异常示例
先演示存储满了再进行存储异常的情况
public class BlockingQueueDemo {
private int queueSize = 10;
private ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(queueSize);
//生产者
class Producer extends Thread {
@Override
public void run() {
for (int i = 0; i < queueSize + 1; i++) {
queue.add(i);
System.out.println("向队列中添加元素,队列剩余空间:" + (queueSize - queue.size()));
}
}
}
public static void main(String[] args) {
BlockingQueueDemo blockingQueueDemo = new BlockingQueueDemo();
Producer producer &#