linkedblockingdeque linkedblockingqueue 使用

概述

LinkedBlockingDequeLinkedBlockingQueue 是 Java 中两个常用的阻塞队列类,它们位于 java.util.concurrent 包中,主要用于在多线程环境中进行安全的队列操作。这两者都支持可选的容量限制,以防止过度增长。

LinkedBlockingDeque

LinkedBlockingDeque 是一个双端阻塞队列,它允许在队列的两端进行插入和移除操作。

常用方法
  1. 添加元素

    • add(E e): 将指定元素插入到队列尾部,如果队列已满,则抛出 IllegalStateException
    • offer(E e): 尝试将元素插入队列尾部,如果队列已满则返回 false
    • offer(E e, long timeout, TimeUnit unit): 尝试在指定时间内将元素插入队列尾部,如果队列已满且在指定时间内未能插入则返回 false
    • put(E e): 将指定元素插入队列尾部,如果队列已满,则等待空间可用。
    • addFirst(E e): 将指定元素插入队列头部,如果队列已满,则抛出 IllegalStateException
    • offerFirst(E e): 尝试将元素插入队列头部,如果队列已满则返回 false
    • offerFirst(E e, long timeout, TimeUnit unit): 尝试在指定时间内将元素插入队列头部,如果队列已满且在指定时间内未能插入则返回 false
    • putFirst(E e): 将指定元素插入队列头部,如果队列已满,则等待空间可用。
    • addLast(E e): 将指定元素插入队列尾部,如果队列已满,则抛出 IllegalStateException
    • offerLast(E e): 尝试将元素插入队列尾部,如果队列已满则返回 false
    • offerLast(E e, long timeout, TimeUnit unit): 尝试在指定时间内将元素插入队列尾部,如果队列已满且在指定时间内未能插入则返回 false
    • putLast(E e): 将指定元素插入队列尾部,如果队列已满,则等待空间可用。
  2. 移除元素

    • remove(): 移除并返回队列头部的元素,如果队列为空,则抛出 NoSuchElementException
    • poll(): 移除并返回队列头部的元素,如果队列为空则返回 null
    • poll(long timeout, TimeUnit unit): 尝试在指定时间内移除并返回队列头部的元素,如果在指定时间内队列仍为空则返回 null
    • take(): 移除并返回队列头部的元素,如果队列为空,则等待元素可用。
    • removeFirst(): 移除并返回队列头部的元素,如果队列为空,则抛出 NoSuchElementException
    • pollFirst(): 移除并返回队列头部的元素,如果队列为空则返回 null
    • pollFirst(long timeout, TimeUnit unit): 尝试在指定时间内移除并返回队列头部的元素,如果在指定时间内队列仍为空则返回 null
    • takeFirst(): 移除并返回队列头部的元素,如果队列为空,则等待元素可用。
    • removeLast(): 移除并返回队列尾部的元素,如果队列为空,则抛出 NoSuchElementException
    • pollLast(): 移除并返回队列尾部的元素,如果队列为空则返回 null
    • pollLast(long timeout, TimeUnit unit): 尝试在指定时间内移除并返回队列尾部的元素,如果在指定时间内队列仍为空则返回 null
    • takeLast(): 移除并返回队列尾部的元素,如果队列为空,则等待元素可用。
  3. 检查元素

    • peek(): 返回队列头部的元素但不移除它,如果队列为空则返回 null
    • peekFirst(): 返回队列头部的元素但不移除它,如果队列为空则返回 null
    • peekLast(): 返回队列尾部的元素但不移除它,如果队列为空则返回 null
  4. 其他操作

    • size(): 返回队列中的元素数量。
    • isEmpty(): 检查队列是否为空。
    • clear(): 移除所有元素。

LinkedBlockingQueue

LinkedBlockingQueue 是一个单端阻塞队列,只允许在队列的尾部插入元素,并在队列的头部移除元素。

常用方法
  1. 添加元素

    • add(E e): 将指定元素插入队列尾部,如果队列已满,则抛出 IllegalStateException
    • offer(E e): 尝试将元素插入队列尾部,如果队列已满则返回 false
    • offer(E e, long timeout, TimeUnit unit): 尝试在指定时间内将元素插入队列尾部,如果队列已满且在指定时间内未能插入则返回 false
    • put(E e): 将指定元素插入队列尾部,如果队列已满,则等待空间可用。
  2. 移除元素

    • remove(): 移除并返回队列头部的元素,如果队列为空,则抛出 NoSuchElementException
    • poll(): 移除并返回队列头部的元素,如果队列为空则返回 null
    • poll(long timeout, TimeUnit unit): 尝试在指定时间内移除并返回队列头部的元素,如果在指定时间内队列仍为空则返回 null
    • take(): 移除并返回队列头部的元素,如果队列为空,则等待元素可用。
  3. 检查元素

    • peek(): 返回队列头部的元素但不移除它,如果队列为空则返回 null
  4. 其他操作

    • size(): 返回队列中的元素数量。
    • isEmpty(): 检查队列是否为空。
    • clear(): 移除所有元素。

区别

  1. 数据结构

    • LinkedBlockingDeque 是一个双端队列,支持在两端进行插入和移除操作。
    • LinkedBlockingQueue 是一个单端队列,只支持在队列尾部插入元素,并在队列头部移除元素。
  2. 方法支持

    • LinkedBlockingDeque 提供了更多的方法来操作队列头部和尾部的元素,例如 addFirstaddLastpollFirstpollLast 等。
    • LinkedBlockingQueue 只提供在队列尾部插入和在队列头部移除的基本方法。
  3. 使用场景

    • LinkedBlockingDeque 适用于需要在两端进行操作的场景,例如实现双端队列或双端阻塞队列的情况。
    • LinkedBlockingQueue 适用于经典的生产者-消费者模型,生产者插入元素到队列尾部,消费者从队列头部移除元素。

结论

LinkedBlockingDequeLinkedBlockingQueue 都是强大的并发工具类,选择哪一个取决于具体的需求。如果你的应用需要在两端进行操作,LinkedBlockingDeque 是一个更好的选择;如果只需要在队列的尾部插入和在队列的头部移除,LinkedBlockingQueue 则更为合适。

---- 文章由 ChatGPT 生成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃饱很舒服

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值