在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue,本文为系列文章第七篇。

BlockingDeque接口和BlockingQueue接口一样都是在java.util.concurrent中定义的,它代表了一个线程安全的“双端队列”,以线程安全的方式向队列中添加元素或获取元素。本篇文章将带大家进一步了解BlockingDeque

deque是 "Double Ended Queue "的缩写。因此“双端队列”的含义就是可以从两端(队首或队尾)插入和取出元素的队列。

如果某个线程既生产又消费同一个队列的元素,那么就可以使用BlockingDeque双端队列。如果生产线程需要在队列的两端插入,而消费线程需要从队列的两端删除,也可以只使用BlockingDeque双端队列。参考下面的图进行理解

一个线程生产元素并将它们插入到队列两端中的任何一端。如果BlockingDeque当前是满的,插入线程将被阻塞,直到移除线程从BlockingDeque中取出一个元素。如果BlockingDeque当前为空,那么移除线程将被阻塞,直到插入线程将一个元素插入到BlockingDeque中。

BlockingDeque 方法

BlockingDeque有4组不同的方法,用于插入、删除和检查deque中的元素。每组方法在所要求的操作不能被立即执行的情况下表现也有所不同。参考下面的表格

队首操作 抛出异常 返回特定值 阻塞后一直等待 阻塞后等待超时
插入对象 addFirst(o) offerFirst(o) putFirst(o) offerFirst(o, timeout, timeunit)
移除对象 removeFirst(o) pollFirst() takeFirst() pollFirst(timeout, timeunit)
检查对象存在 getFirst() peekFirst()
队尾操作 抛出异常 返回特定值 阻塞后一直等待 阻塞后等待超时
插入对象 addLast(o) offerLast(o) putLast(o) offerLast(o, timeout, timeunit)
移除对象 removeLast(o) pollLast() takeLast() pollLast(timeout, timeunit)
检查对象存在 getLast() peekLast()

大家可以看到,这些方法和和BlockingQueue的方法有些相似,只是在方法的基础上加了xxxFirst和xxxLast,所以可以参考我之前的文章对比学习),上面的方法的四种行为分别的含义是

  1. 抛出异常: 如果调用方法后不能立即响应结果(空队列或满队列),则抛出异常。
  2. 返回特定值: 如果调用方法后不能立即响应结果(空队列或满队列),则返回特定的值(通常是true/false),true表示方法执行成功,否则表示方法执行失败。
  3. 阻塞后一直等待: 如果调用方法后不能立即响应结果(空队列或满队列),该方法将被阻塞一直处于等待状态。
  4. 阻塞后等待超时: 如果调用方法后不能立即响应结果(空队列或满队列),该方法将在一定时间范围内被阻塞等待,也就是在超时时间范围内阻塞。当超出超时时间之后,方法线程将不再阻塞,而是返回一个特定的值(通常是true/false),true表示方法执行成功,否则表示方法执行失败。

BlockingDeque继承BlockingQueue

BlockingDeque接口继承了BlockingQueue接口。这意味着你可以将BlockingDeque作为一个BlockingQueue使用。如果你这样做,各种插入方法将把元素添加到deque的末尾,而移除方法将从deque的队首移除元素。BlockingQueue接口的插入和删除方法,就是这样做的。

下面是BlockingQueue的方法在BlockingDeque实现中的作用对照表

BlockingQueue BlockingDeque
add() addLast()
offer() offerLast()
put() putLast()
remove() removeFirst()
poll pollFirst()
take() takeFirst()
element() getFirst()
peek() peekFirst()

BlockingDeque 接口实现类

BlockingDeque是一个接口,所以当我们真正对它进行实例化的时候,需要使用它的接口实现类。在java.util.concurrent包中的LinkedBlockingDeque方法实现了BlockingDeque接口。

其使用方法也与BlockingQueue 大同小异,所以此处只做简单的介绍。

//初始化一个LinkedBlockingDeque
BlockingDeque<String> deque = new LinkedBlockingDeque<String>(); deque.addFirst("1");//向队首添加元素
deque.addLast("2"); //向队尾添加元素 String two = deque.takeLast(); //从队尾获取元素
String one = deque.takeFirst(); //从队首获取元素

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

java并发编程工具类JUC第七篇:BlockingDeque双端阻塞队列的更多相关文章

  1. java并发编程工具类JUC第四篇:LinkedBlockingQueue链表队列

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue. LinkedBlockingQueue 队列是Blo ...

  2. java并发编程工具类JUC第八篇:ConcurrentHashMap

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

  3. java并发编程工具类JUC第三篇:DelayQueue延时队列

    DelayQueue 是BlockingQueue接口的实现类,它根据"延时时间"来确定队列内的元素的处理优先级(即根据队列元素的"延时时间"进行排序).另一层 ...

  4. java并发编程工具类JUC第一篇:BlockingQueue阻塞队列

    Java BlockingQueue接口java.util.concurrent.BlockingQueue表示一个可以存取元素,并且线程安全的队列.换句话说,当多线程同时从 JavaBlocking ...

  5. java并发编程工具类JUC第二篇:ArrayBlockingQueue

    类ArrayBlockingQueue是BlockingQueue接口的实现类,它是有界的阻塞队列,内部使用数组存储队列元素.这里的"有界"是指存储容量存在上限,不能无限存储元素. ...

  6. Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo

    Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...

  7. java并发编程工具类辅助类:CountDownLatch、CyclicBarrier和 Semaphore

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 以下 ...

  8. Java并发编程入门,看这一篇就够了

    Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容.这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些都是并发编程的基本知识,除了使用这些工具以外,Java并发编程中涉 ...

  9. JUC : 并发编程工具类的使用

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.JUC是什么 1.JUC定义 JUC,即java.util.concurrent 在并发编程中使用的 ...

随机推荐

  1. [ssh登录]ssh登录报警

    1.报警脚本 mkdir /scripts vim /scripts/telegram_ssh.sh #!/bin/bash text="用户: $PAM_USER 用户IP: $PAM_R ...

  2. 内网域渗透之MS14-068复现

    在做域渗透测试时,当我们拿到了一个普通域成员的账号后,想继续对该域进行渗透,拿到域控服务器权限.如果域控服务器存在MS14_068漏洞,并且未打补丁,那么我们就可以利用MS14_068快速获得域控服务 ...

  3. pr中打开Audition编辑剪辑?

    前景 现在一般的adobe全家桶都是一键安装破解. 天翼网盘链接,下载不限速,没有账号就现注册一个即可. https://cloud.189.cn/t/UZRjuqAZ3E7r (访问码:8ago) ...

  4. 【vue-08】vuex

    vuex的作用 简单理解,就是将多个组件共享的变量统一放到一个地方去管理,比如用户登录时的数据token. 快速上手 安装:npm install vuex 首先,我们在src文件夹下创建一个文件夹: ...

  5. 一种用于 API 的查询语言-GraphQL

    GitHub地址 官网地址 中文网址

  6. MySQL导入与导出SQL

    一.导入SQL 方法一: (1)选择数据库 use databaseName; (2)设置数据库编码 set names utf8; (3)导入数据(注意sql文件的路径) source **.sql ...

  7. Lombok Requires Annotation Processing Annotation processing seems to be disabled for the project "HelloWorld". For  plugin to function correctly, please enable it under "Settings > Build > Compiler >

    更多精彩详见微信公众号  在网上查找说是插件的问题,但是我安装类插件父级项目没有开启注解处理Annotation Processor,子项目都有开启,如图,顶级项目是demo,下面的都是子项目,把第一 ...

  8. python之xlwt

    python写excel----xlwt 写excel的拿点不在构造一个workbook的本身,二是填充的数据,不过这不在范围内,在写excel的操作中也有棘手的问题, 比如写入合并的单元格就是比较麻 ...

  9. Java筑基 - JNI到底是个啥

    在前面介绍Unsafe的文章中,简单的提到了java中的本地方法(Native Method),它可以通过JNI(Java Native Interface)调用其他语言中的函数来实现一些相对底层的功 ...

  10. 微服务架构开发电商系统需要用Redis、ES和MQ吗?

    如果不用什么很高大上的东西,就是有多个微服务就行这种技术架构会很难吗? 我看了一些视频,他们都用到了es.mq.redis的东西,我想不用这些东西,就简单的有多个服务,这样可行吗? 01 使用微服务你 ...