阻塞队列概述
当队列是空的,从队列获取元素操作将会阻塞,直到其他线程往队列插入新的元素
当队列满了,从队列获取元素的操作将会阻塞,直到其他线程从队列中移除一个或多个元素。
BlockingQueue实现类
BlockingQueue是一个接口,它的父接口包括Collection Iterable Queue
- ArrayBlockingQueue (常用) : 由数组结构组成的有界的阻塞队列
- LinkedBlockingQueue(常用) : 由链表组成的有界的阻塞队列,默认大小为最大整型值
- DelayQueue :只有指定延迟时间到了才能从队列中获取到该元素,队列没有大小限制,往往插入永远不会阻塞
- PriorityBlockingQueue : 里面支持优先级排序的无界阻塞队列
- SynchronousQueue :不存储元素的阻塞队列,即单个元素的队列
- LinkedTransferQueue : 由链表组成的无界的阻塞队列
- LinkedBlockingDeque : 由链表组成的双向阻塞队列
常用方法:
代码测试:
public class BlockingQueueDemo {
public static void main(String[] args) throws InterruptedException {
//创建阻塞队列
BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.add("A"));
System.out.println(blockingQueue.add("B"));
System.out.println(blockingQueue.add("C"));
//第一组方法 抛出异常 add() remove() element()
// System.out.println(blockingQueue.add("W"));
// System.out.println(blockingQueue.remove());
// System.out.println(blockingQueue.remove());
// System.out.println(blockingQueue.remove());
// System.out.println(blockingQueue.element());
// System.out.println(blockingQueue.remove());
//第二组方法 返回特殊值 offer() poll() peek()
// System.out.println(blockingQueue.offer("www"));
// System.out.println(blockingQueue.poll());
// System.out.println(blockingQueue.poll());
// System.out.println(blockingQueue.poll());
// System.out.println(blockingQueue.poll());
//第三组方法 阻塞 put() take()
// blockingQueue.put("WW");
// System.out.println(blockingQueue.take());
// System.out.println(blockingQueue.take());
// System.out.println(blockingQueue.take());
// System.out.println(blockingQueue.take());
//第四组 阻塞,超时放弃 offer(e, time, unit) poll(time, unit)
// blockingQueue.offer("ww",3, TimeUnit.SECONDS);
// System.out.println(blockingQueue.offer("www"));
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll(3, TimeUnit.SECONDS));
}
}