阻塞队列概述
Concurrent 包中,BlockingQueue 很好的解决了多线程中,如何高效安全 “传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建 高质量的多线程程序带来极大的便利。<br /> 阻塞队列,顾名思义,首先它是一个队列, 通过一个共享的队列,可以使得数据 由队列的一端输入,从另外一端输出。<br />好处:不用关心内部何时唤醒,何时阻塞,是一个封装好的数据结构<br />
- 试图从空的队列中获取元素的线程(take)将会被阻塞(被挂起),直到其他线程往空的队列插入新的元素 ,则自动唤醒被挂起的线程。
试图向已满的队列中添加新元素的线程(put)将会被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来并后续新增
阻塞队列分类
父接口:Queue,阻塞队列实现类为以下几种:
ArrayBlockingQueue(常用):由数组结构组成的有界阻塞队列
- LinkedBlockingQueue(常用):由链表结构组成的有界(但大小默认值为integer.MAX_VALUE)阻塞队列
- DelayQueue:使用优先级队列实现的延迟无界阻塞队列
- PriorityBlockingQueue:支持优先级排序的无界阻塞队列
- SynchronousQueue:不存储元素的阻塞队列,也即单个元素的队列
- LinkedTransferQueue:由链表组成的无界阻塞队列
- LinkedBlockingDeque:由链表结构组成的双向阻塞队列
阻塞队列核心方法
插入,移除,检查调用不同的方法,发生异常时有不同的处理方式
代码演示: ```java import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; /**
阻塞队列 */ public class BlockingQueueDemo { public static void main(String[] args) throws InterruptedException {
// List list = new ArrayList(); BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3); //第一组 // System.out.println(blockingQueue.add("a")); // System.out.println(blockingQueue.add("b")); // System.out.println(blockingQueue.add("c")); // System.out.println(blockingQueue.element()); //System.out.println(blockingQueue.add("x")); //Queue full 报异常止步于此 // System.out.println(blockingQueue.remove()); // System.out.println(blockingQueue.remove()); // System.out.println(blockingQueue.remove()); // System.out.println(blockingQueue.remove());
==========================================================
// 第二组 // System.out.println(blockingQueue.offer("a")); // System.out.println(blockingQueue.offer("b")); // System.out.println(blockingQueue.offer("c")); // System.out.println(blockingQueue.offer("x")); // System.out.println(blockingQueue.poll()); // System.out.println(blockingQueue.poll()); // System.out.println(blockingQueue.poll()); // System.out.println(blockingQueue.poll());
true true true false a b c
null
// 第三组 // blockingQueue.put("a"); // blockingQueue.put("b"); // blockingQueue.put("c"); // //blockingQueue.put("x"); //阻塞 止步于此 // System.out.println(blockingQueue.take()); // System.out.println(blockingQueue.take()); // System.out.println(blockingQueue.take()); // System.out.println(blockingQueue.take());
==========================================================
// 第四组 System.out.println(blockingQueue.offer("a")); System.out.println(blockingQueue.offer("b")); System.out.println(blockingQueue.offer("c")); System.out.println(blockingQueue.offer("a",3L, TimeUnit.SECONDS)); //3s后报false
} } ```