阻塞队列概述

  1. Concurrent 包中,BlockingQueue 很好的解决了多线程中,如何高效安全 “传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建 高质量的多线程程序带来极大的便利。<br /> 阻塞队列,顾名思义,首先它是一个队列, 通过一个共享的队列,可以使得数据 由队列的一端输入,从另外一端输出。<br />好处:不用关心内部何时唤醒,何时阻塞,是一个封装好的数据结构<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1632128129476-4c44106a-3e5f-4ade-8a16-5a76ec87d77a.png#clientId=u5b373e5c-f6ec-4&from=paste&height=443&id=egfI0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=443&originWidth=938&originalType=binary&ratio=1&size=282105&status=done&style=none&taskId=ub51fd0c1-42e4-4fcf-9f59-be3fcbb9684&width=938)
  1. 试图从空的队列中获取元素的线程(take)将会被阻塞(被挂起),直到其他线程往空的队列插入新的元素 ,则自动唤醒被挂起的线程。
  2. 试图向已满的队列中添加新元素的线程(put)将会被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来并后续新增

    阻塞队列分类

    父接口:Queue,阻塞队列实现类为以下几种:

  3. ArrayBlockingQueue(常用):由数组结构组成的有界阻塞队列

  4. LinkedBlockingQueue(常用):由链表结构组成的有界(但大小默认值为integer.MAX_VALUE)阻塞队列
  5. DelayQueue:使用优先级队列实现的延迟无界阻塞队列
  6. PriorityBlockingQueue:支持优先级排序的无界阻塞队列
  7. SynchronousQueue:不存储元素的阻塞队列,也即单个元素的队列
  8. LinkedTransferQueue:由链表组成的无界阻塞队列
  9. LinkedBlockingDeque:由链表结构组成的双向阻塞队列

    阻塞队列核心方法

    插入,移除,检查调用不同的方法,发生异常时有不同的处理方式
    image.png
    代码演示: ```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
    

    } } ```