BlockingDeque 阻塞双端队列

时间:2020-01-09 10:36:25  来源:igfitidea点击:

" java.util.concurrent"类中的" BlockingDeque"接口表示一个双端队列,该双端队列可以安全地放入线程中并从中获取实例。在本文中,我将向我们展示如何使用此BlockingDeque

BlockingDeque类是一个'Deque',它阻止线程调优以从双端队列中插入或者删除元素,以防无法从双端队列中插入或者删除元素。

"双端队列"是"双端队列"的缩写。因此,"双端队列"是一个队列,我们可以从两端插入和取出元素。

阻塞双端使用

如果线程同时产生和消耗同一队列中的元素,则可以使用BlockingDeque。如果生产线程需要在队列的两端插入,而消费线程需要从队列的两端移除,则也可以使用它。

线程将产生元素并将其插入队列的任一端。如果双端队列当前已满,则插入线程将被阻塞,直到移除线程将一个元素从双端队列中取出。如果双端队列当前为空,则删除线程将被阻塞,直到插入线程将元素插入双端队列为止。

BlockingDeque方法

" BlockingDeque"具有4种不同的方法来插入,删除和检查双端队列中的元素。如果无法立即执行所请求的操作,则每组方法的行为都会有所不同。

这4种不同的行为集意味着:

  • 引发异常:如果无法立即进行尝试的操作,则会引发异常。
  • 特殊值:如果无法立即尝试操作,则会返回一个特殊值(通常为true / false)。
  • 阻止:如果无法立即执行尝试的操作,则该方法调用将阻止直到成功。
  • 超时:如果无法立即进行尝试的操作,则该方法调用将一直阻塞直到成功,但等待时间不得长于给定的超时。返回一个特殊值,告诉操作是否成功(通常为true / false)。

BlockingDeque扩展了BlockingQueue

" BlockingDeque"接口扩展了" BlockingQueue"接口。这意味着我们可以将BlockingDeque用作BlockingQueue。如果这样做,各种插入方法会将元素添加到双端队列的末尾,而remove方法将从双端队列的开头删除这些元素。即,BlockingQueue接口的插入和删除方法。

BlockingDeque实现

由于BlockingDeque是一个接口,因此我们需要使用其众多实现之一来使用它。 java.util.concurrent软件包具有BlockingDeque接口的以下实现:

  • LinkedBlockingDeque

BlockingDeque代码示例

这是一个如何使用BlockingDeque方法的小代码示例:

BlockingDeque<String> deque = new LinkedBlockingDeque<String>();

deque.addFirst("1");
deque.addLast("2");

String two = deque.takeLast();
String one = deque.takeFirst();