关于spring:java并发编程工具类JUC第七篇BlockingDeque双端阻塞队列

36次阅读

共计 2443 个字符,预计需要花费 7 分钟才能阅读完成。

在之前的文章中曾经为大家介绍了 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(); // 从队首获取元素

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

本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 – zimug.com

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学 Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2 一本通》
  • 《实战前后端拆散 RBAC 权限管理系统》
  • 《实战 SpringCloud 微服务从青铜到王者》
  • 《VUE 深入浅出系列》

正文完
 0