JAVA多线程-BlockingDeque

BlockingDeque接口是java.util.concurrent包中安全的放入和取实例的双向队列的代表。这篇文章介绍了BlockingDeque的用法.

BlockingDeque类是一个Deque,当线程试图从Deque中插入或删除元素可能会阻塞。

Deque双端队列的缩写。因此deque是一个两端都可以插入或者取元素的队列.

BlockingDeque用法

如果一个线程既要向队列中添加元素,又要从同一个队列中取元素,那么BlockingDeque将是非常有用的。如果消费者线程既要从队列的头部取元素,也要从队列的尾部取元素;或者生产者线程需要插入元素到队列的两端,那么BlockingDeque也是非常有用的。

下图是描述:

BlockingDeque:线程可以从两端插入,取出元素

 一个线程可以插入元素到队列的任一端。如果队列full,那么线程将会阻塞,直到其他线程从队列中取出一个元素为止。如果队列empty,那么从队列中取元素的线程将会阻塞,直到其他线程插入一个元素为止。

BlockingDeque的方法

BlockingDeque有4类方法,可以插入,删除,执行队列中的元素。

如果无法立即执行请求的操作,则每组方法的行为都不同。

下表是方法:

 

Throws Exception

Special Value

Blocks

Times Out

Insert

addFirst(o)

offerFirst(o)

putFirst(o)

offerFirst(o, timeout, timeunit)

Remove

removeFirst(o)

pollFirst(o)

takeFirst(o)

pollFirst(timeout, timeunit)

Examine

getFirst(o)

peekFirst(o)

 

 

 

 

Throws Exception

Special Value

Blocks

Times Out

Insert

addLast(o)

offerLast(o)

putLast(o)

offerLast(o, timeout, timeunit)

Remove

removeLast(o)

pollLast(o)

takeLast(o)

pollLast(timeout, timeunit)

Examine

getLast(o)

peekLast(o)

 

 

4中方法不同的行为:

  1. Throws Exception:
    如果操作不能立即被执行,那么将抛出异常.
  2. Special Value:
    如果操作不能被立即执行,那么将返回一个异常值(一般情况下是true/false
  3. Blocks:
    如果操作不能被立即执行,那么操作将会阻塞,直至可以执行。
  4. Times Out:
    如果操作不能被立即执行,那么操作将会阻塞,直至可以执行,或者超时时间到。函数的返回值说明了操作是否执行成功。

BlockingDeque继承BlockingQueue

BlockingDeque接口继承了 BlockingQueue接口. 这意味着可以把BlockingDeque 当着BlockingQueue . 如果你使用BlockingDeque作为BlockingQueue,那么BlockingQueue的插入操作就是把元素插入到BlockDeque的尾部。移出操作将是移出BlockDeque头部的元素

下面是BlockingDeque实现了 BlockingQueue中的一些方法:

BlockingQueue

BlockingDeque

add()

addLast()

offer() x 2

offerLast() x 2

put()

putLast()

 

 

remove()

removeFirst()

poll() x 2

pollFirst()

take()

takeFirst()

 

 

element()

getFirst()

peek()

peekFirst()

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();

参考翻译:http://tutorials.jenkov.com/java-util-concurrent/blockingdeque.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值