在之前的文章中曾经为大家介绍了 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,所以能够参考我之前的文章比照学习),下面的办法的四种行为别离的含意是
- 抛出异样: 如果调用办法后不能立刻响应后果(空队列或满队列),则抛出异样。
- 返回特定值: 如果调用办法后不能立刻响应后果(空队列或满队列),则返回特定的值(通常是 true/false),true 示意办法执行胜利,否则示意办法执行失败。
- 阻塞后始终期待: 如果调用办法后不能立刻响应后果(空队列或满队列),该办法将被阻塞始终处于期待状态。
- 阻塞后期待超时: 如果调用办法后不能立刻响应后果(空队列或满队列),该办法将在肯定工夫范畴内被阻塞期待,也就是在超时工夫范畴内阻塞。当超出超时工夫之后,办法线程将不再阻塞,而是返回一个特定的值(通常是 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 深入浅出系列》