BlockingQueue 方法详细描述

soゝso 2016-08-22 17:57:13 4418

BlockingQueue  简单看可以是一个集合,因为的他的父类Queue<?>继承了Collection<?>。所以它拥有了集合基础方法和特征。

一、常用方法解析。

public interface BlockingQueue<E> extends Queue<E> {
	/**
	 * 把e加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则throw new IllegalStateException("Queue full") 
	 */
    boolean add(E e);
    
    /**
     * 把e加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续添加。
     * @param e
     * @throws InterruptedException
     */
    void put(E e) throws InterruptedException;
    /**
     * 将e加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.
     */
    boolean offer(E e);
    /**
     * 将e加到BlockingQueue里。
     * 多了的参数请看参数描述
     * @param e			对象
     * @param timeout	超时时间
     * @param unit		超时时间单位(枚举类型),具体看源码
     * @return			即如果BlockingQueue可以容纳,则返回true,否则返回false.
     * @throws InterruptedException
     */
    boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException;
    /**
     * 取走BlockingQueue里排在第一个对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止.
     * @return
     * @throws InterruptedException
     */
    E take() throws InterruptedException;
    /**
     * 取走BlockingQueue里排在第一个对象,若不能立即取出,则可以等time参数规定的时间,如果到达时间还取不到,那么返回Null
     * @param timeout	时间
     * @param unit		枚举时间单位,具体看源码
     * @return
     * @throws InterruptedException
     */
    E poll(long timeout, TimeUnit unit)
        throws InterruptedException;
    
}

其实上面分解的是:LinkedBlockingQueue<E>

二、使用的时候注意一些什么问题。

  1. 存储的对象不能为Null,否则会throw NullPointerException
  2. BlockingQueue  可以是限定容量的。它在任意给定时间都可以有一个remainingCapacity,超出此容量,便无法无阻塞地put附加元素。没有任何内部容量约束的 BlockingQueue  总是报告Integer.MAX_VALUE的剩余容量。或者在new的时候就给定额度。
  3. BlockingQueue  实现主要用于生产者-使用者队列,但它另外还支持Collection接口。因此,举例来说,使用remove(x) 从队列中移除任意一个元素是有可能的。然而,这种操作通常不 会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。
  4. BlockingQueue  实现是线程安全的。所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。然而,大量的 Collection操作(addAllcontainsAllretainAllremoveAll)没有 必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了c 中的一些元素后,addAll(c)有可能失败(抛出一个异常)。
  5. BlockingQueue  实质上不支持使用任何一种“close”或“shutdown”操作来指示不再添加任何项。这种功能的需求和使用有依赖于实现的倾向。例如,一种常用的策略是:对于生产者,插入特殊的end-of-stream 或poison 对象,并根据使用者获取这些对象的时间来对它们进行解释。

三、简单说明它的常用实现类。



  • ArrayBlockingQueue:规定大小的 BlockingQueue  ,其构造函数必须带一个int参数来指明其大小,其所含的对象是以FIFO(先入先出)顺序排序的。
  • LinkedBlockingQueue:大小不定的 BlockingQueue  ,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的 BlockingQueue  的大小由Integer.MAX_VALUE来决定,其所含的对象是以FIFO(先入先出)顺序排序的。
  • PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的 Comparator  决定的顺序。
  • SynchronousQueue:特殊的 BlockingQueue  ,对其的操作必须是放和取交替完成的。

PS:其中LinkedBlockingQueueArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue

但是我还是用LinkedBlockingQueue,就是这么任性。


版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/65.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
解JavaScript中splice()方法,有Demo详细介绍
Spring JPA查询,JPA 根据方法名字查询详细介绍
Linux 安装 Redis 详细步骤讲解
Maven的Mirror和Repository 的详细讲解
HttpClient 获取详细的头信息
Urlrewrite Java 伪静态 urlrewrite.xml 配置参数描述
Ehcache配置详细解释
document.domain解决跨域问题,详细讲解。
对Java的常用对象(POJO、DTO、PO、BO、VO、DAO)详细解释及应用场景
Druid数据库配置详细介绍。网上一团糟。
最新文章
QUIC / HTTP3 协议详细分析讲解 906
恭喜那个做云存储的七牛云完成 F 轮 10 亿人民币的融资,开启新的云旅程 1605
Autojs怎么安全加密?Autojs在线加密工具注意事项。 2541
Java JSON 组件选型之 FastJson 为什么总有漏洞? 7260
使用七牛云存储实现图片API,自动删除图片方案合集 2366
神速ICP备案经验分享,ICP备案居然一天就通过了 3655
百度加强推送URL链接,百度SEO强行推送链接JavaScript代码案例讲解。 3909
SOJSON 拓展服务器被DDos攻击了一晚上,是如何解决的? 4636
湖南地区备案“新增网站需提交组网方案或解释说明”,关于备案做简单叙述 4784
企查查你是个什么企业,骗子的帮凶,诈骗的集中营,通过企查查骚扰企业电话不断,为所欲为的企查查 11672
最热文章
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 462387
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 431178
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 363121
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 352543
免费天气API,天气JSON API,不限次数获取十五天的天气预报 317825
Elasticsearch教程(四) elasticsearch head 插件安装和使用 237119
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 200953
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 146061
Elasticsearch教程(一),全程直播(小白级别) 126254
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 103039

骚码加入我们 / 千人QQ群:259217951

入群需要5元为的是没有垃圾广告,如果没有QQ钱包,可以加群主拉进。

二维码生成 来自 >> 二维码生成器

支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...