BlockingQueue

java.util.concurrent 包里的 BlockingQueue 接口表示一个线程安放入和提取实例的队列。

BlockingQueue用法

BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。下图是
对这个原理的阐述:
在这里插入图片描述
一个线程往里边放,另外一个线程从里边取的一个 BlockingQueue 。

一个线程将会持续生产新对象并将其插入到队列之中,直到队列达到它所能容纳的临界点。
也就是说,它是有限的。如果该阻塞队列到达了其临界点,负责生产的线程将会在往里边插
入新对象时发生阻塞。它会一直处于阻塞之中,直到负责消费的线程从队列中拿走一个对象。
负责消费的线程将会一直从该阻塞队列中拿出对象。如果消费线程尝试去从一个空的队列中
提取对象的话,这个消费线程将会处于阻塞之中,直到一个生产线程把一个对象丢进队列。

BlockingQueue 的方法

BlockingQueue 具有 4 组不同的方法用于插入、移除以及对队列中的元素进行检查。如果
请求的操作不能得到立即执行的话,每个方法的表现也不同。这些方法如下:
在这里插入图片描述
四组不同的行为方式解释:

  1. 抛异常:如果试图的操作无法立即执行,抛一个异常。
  2. 特定值:如果试图的操作无法立即执行,返回一个特定的值(常常是 true / false)。
  3. 阻塞:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行。
  4. 超时:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,但等
    待时间不会超过给定值。返回一个特定值以告知该操作是否成功(典型的是 true / false)。
    无法向一个 BlockingQueue 中插入 null。如果你试图插入 null,BlockingQueue 将会抛出
    一个 NullPointerException。

可以访问到 BlockingQueue 中的所有元素,而不仅仅是开始和结束的元素。比如说,你将
一个对象放入队列之中以等待处理,但你的应用想要将其取消掉。那么你可以调用诸如
remove(o) 方法来将队列之中的特定对象进行移除。但是这么干效率并不高(译者注:基于队
列的数据结构,获取除开始或结束位置的其他对象的效率不会太高),因此你尽量不要用这
一类的方法,除非你确实不得不那么做。

BlockingQueue 的实现

BlockingQueue 是 个 接 口 , 你 需 要 使 用 它 的 实 现 之 一 来 使 用 BlockingQueue 。
java.util.concurrent 具有以下 BlockingQueue 接口的实现(Java 6):

  1. ArrayBlockingQueue 数组阻塞队列
  2. DelayQueue 延迟队列
  3. LinkedBlockingQueue 链阻塞队列
  4. PriorityBlockingQueue 具有优先级的阻塞队列
  5. SynchronousQueue 同步队列
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值