JAVA 多线程中的队列分类:阻塞队列,有界队列,无界队列

说明

在并发编程中,有时候需要使用线程安全的队列。

实现线程安全的队列有两种方式:

  • 阻塞队列
  • 非阻塞队列

阻塞队列

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。

  • 支持阻塞的插入方法offer:当队列满时,队列会阻塞插入元素的线程,直到队列不满。

  • 支持阻塞的移除方法take:在队列为空时,获取元素的线程会等待队列变为非空。

例子

  1. 生产线程1 往阻塞队列里面添加新的数据,当阻塞队列满的时候(针对有界队列),生产线程1 将会处于阻塞状态,直到 消费线程2 从队列中取走一个数据;

  2. 消费线程2 从阻塞队列取数据,当阻塞队列空的时候,消费线程2 将会处于阻塞状态,直到生产线程1把一个数据放进去。

应用场景

阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。

非阻塞队列

非阻塞队列:若队列为空从中获取元素则会返回空,若队列满了插入元素则会抛出异常。

有界与无界

有界队列

有固定大小的队列。比如设定了固定大小的ArrayBlockingQueue,又或者大小为0,只是在生产者和消费者中做中转用的 SynchronousQueue

无界队列

没有设置固定大小的队列。这些队列的特点是可以直接入列,实际上不会有无限大的容量:

  • 内存有限,过多会导致内存溢出
  • 队列中的元素不能超过 Integer.MAX_VALUE

一般生成环境中不会使用

参考:
https://blog.csdn.net/u022812849/article/details/114698692
https://www.jianshu.com/p/b1d383d4021c


原文出处:/show_1IX4d2HHorcV.html