BlockingQueue的基本使用

本文介绍了Java中的两种阻塞队列——ArrayBlockingQueue和LinkedBlockingQueue,它们都是有序的,支持先进先出操作。ArrayBlockingQueue基于数组实现,是有限定容量的阻塞队列,而LinkedBlockingQueue以链表形式存储数据,可选择有界或无界。两者在锁机制上有所不同,影响了其性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列

队列继承关系

在这里插入图片描述

BlockingQueue队列

BlockingQueue基本增删操作

抛出异常特殊值阻塞超时
插入add(e)offer(e)put(e)offer(e, time, unit)
移除remove()poll()take()poll(time, unit)
检查element()peek()不可用不可用

详细介绍

  • add(E e):把 e 加到 BlockingQueue 里,即如果 BlockingQueue 可以容纳,则返回 true,否则报异常
  • offer(E e):表示如果可能的话,将 e 加到 BlockingQueue 里,即如果 BlockingQueue 可以容纳,则返回 true,否则返回 false
  • put(E e):把 e 加到 BlockingQueue 里,如果 BlockQueue 没有空间,则调用此方法的线程被阻断直到 BlockingQueue 里面有空间再继续
  • poll(time):取走 BlockingQueue 里排在首位的对象,若不能立即取出,则可以等 time 参数规定的时间,取不到时返回 null
  • take():取走 BlockingQueue 里排在首位的对象,若 BlockingQueue 为空,阻断进入等待状态直到 Blocking 有新的对象被加入为止

ArrayBlockingQueue

介绍

​ ArrayBlockingQueue是一个阻塞式的队列,继承自AbstractBlockingQueue,间接的实现了Queue接口和Collection接口,实现了Serializable接口说明ArrayBlockingQueue是有序的。底层以数组的形式保存数据(实际上可看作一个循环数组)。常用的操作包括 add,offer,put,remove,poll,take,peek。

​ 根据 ArrayBlockingQueue 的名字我们都可以看出,它是一个队列,并且是一个基于数组的阻塞队列

​ ArrayBlockingQueue 是一个有界队列,有界也就意味着,它不能够存储无限多数量的对象。所以在创建 ArrayBlockingQueue 时,必须要给它指定一个队列的大小。

​ 对于元素的入队列和出队列使用的是同一个lock对象。(源码110行)

我们先来熟悉一下 ArrayBlockingQueue 中的几个重要的方法。

  • remainingCapacity():剩余可用的大小。等于初始容量减去当前的 size
  • size():当前对列中元素数量

ArrayBlockingQueue 使用场景。

  • 先进先出队列(队列头的是最先进队的元素;队列尾的是最后进队的元素)
  • 有界队列(即初始化时指定的容量,就是队列最大的容量,不会出现扩容,容量满,则阻塞进队操作;容量空,则阻塞出队操作)
  • 队列不支持空元素

LinkedBlockingQueue

介绍

​ LinkedBlockingQueue是一个阻塞队列,其大小的配置是可选的,如果我们初始化时指定一个大小,它就是有边界的,如果不指定,它就是无边界的。说是无边界,其实是采用了默认大小为Integer.MAX_VALUE的容量 。

​ 继承自AbstractBlockingQueue,间接的实现了Queue接口和Collection接口,实现了Serializable接口说明LinkedBlockingQueue是有序的。底层以单向链表的形式保存数据。常用的操作包括 add,offer,put,remove,poll,take,peek。

​ 与ArrayBlockingQueue一样,LinkedBlockingQueue 也是以先进先出的方式存储数据,最新插入的对象是尾部,最新移出的对象是头部

​ LinkedBlockingQueue入队列和出队列使用的是两个不同的lock对象,所以在多个CPU的情况下,它们可以做到真正的在同一时刻既消费、又生产,能够做到并行处理。故LinkedBlockingQueue的吞吐量要高于ArrayBlockingQueue。(源码154行)

我们先来熟悉一下 ArrayBlockingQueue 中的几个重要的方法。

  • remainingCapacity():剩余可用的大小。等于初始容量减去当前的 size
  • size():当前对列中元素数量

LinkedBlockingQueue使用场景。

  • 先进先出队列(队列头的是最先进队的元素;队列尾的是最后进队的元素)

  • 可以是有界队列(即初始化时指定的容量,就是队列最大的容量,不会出现扩容,容量满,则阻塞进队操作;容量空,则阻塞出队操作)也可以是无界队列(其实是采用了默认大小为Integer.MAX_VALUE的容量 )。

  • 队列不支持空元素

    源码分析文章

priorityBlockingQueue

​ 是一个无界队列,它没有限制,在内存允许的情况下可以无限添加元素;它又是具有优先级的队列,是通过构造函数传入的对象来判断,传入的对象必须实现comparable/comparator接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值