2022-10-27 16:23:02
浏览数 (1)
概述
代码语言:javascript
复制1.队列的原则:FIFO(先进先出)
2.BlockingQueue是有界限的,容量定义好之后不能改变
3.阻塞:如果队列满了之后再往里面塞数据会阻塞,当队列为空时,则试图获取元素的操作会被阻塞。
4.BlockingQueue不允许元素为null
阻塞式队列的四个实现类
代码语言:javascript
复制ArrayBlockingQueue -- 阻塞式顺序队列
a.底层使用数组来存储数据
b.使用的时候需要指定容量
LinkedBlockingQueue -- 阻塞式链式队列
a.底层基于节点来存储数据
b.使用的时候可以指定容量也可以不指定。如果不指定容量,则容量为
Integer.MAX_VALUE,即的次方减,这种情况下一般认为这个队列是无限的。
如果指定了容量,则容量是不可变的.
PriorityBlockingQueue -- 具有优先级的阻塞式队列
a.底层是基于数组来存储数据
b.使用的时候可以不指定容量,如果不指定容量,则默认容量为
c.要求存入的元素必须实现Comparable接口
d.在PriorityBlockingQueue中,使用迭代遍历不保证排序
SynchronousQueue -- 同步队列
. 在使用的时候不需要指定容量,容量默认为且只能为
基于ArrayBlockingQueue对相关api的实现
代码语言:javascript
复制package com.jmy.BlockingQueneDemo;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
/*
顺序阻塞时队列 底层使用数组结构
*/
public class ArrayBlockingQueueDemo {
public static void main(String[] args) throws InterruptedException {
// 使用时需要指定容量
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>();
// 添加元素
queue.add("a");
queue.offer("b");
queue.put("c");
// 队列现在已满
// 使用add添加元素会抛出异常
queue.add("d"); // Exception in thread "main" java.lang.IllegalStateException: Queue full
// 使用offer可以获取特殊的布尔返回值
System.out.println(queue.offer("e")); // false
// 使用put 会产生阻塞
queue.put("f");
// 使用offer的重载方法可以实现定时阻塞
queue.offer("g",, TimeUnit.SECONDS);
// 移除元素
System.out.println(queue.remove());
System.out.println(queue.poll());
System.out.println(queue.take());
// 队列元素为空
// 使用remove 会抛出异常
queue.remove(); // java.util.NoSuchElementException
// 使用poll 可以得到返回值为null
System.out.println(queue.poll());
// 使用take 会产生阻塞
queue.take();
// 使用poll的重载方法实现定时阻塞
queue.poll(,TimeUnit.SECONDS); // 阻塞3秒
}
}