BlockingQueue 方法详细描述

soゝso 2016-08-22 17:57:13 1002
分享到:

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,就是这么任性。


关于作者
目前就职于国内某电商平台公司打杂。。
相关文章
解JavaScript中splice()方法,有Demo详细介绍
HttpClient 获取详细的头信息
Urlrewrite Java 伪静态 urlrewrite.xml 配置参数描述
Bootstrap Affix 插件 高级用法详细讲解
Maven的Mirror和Repository 的详细讲解
Ehcache配置详细解释
对Java的常用对象(POJO、DTO、PO、BO、VO、DAO)详细解释及应用场景
document.domain解决跨域问题,详细讲解。
Plupload 上传详细讲解,Plupload 多实例上传,Plupload多个上传按钮
Shiro教程,Shiro 配置文件详细解释,Shiro自定义Filter配置
最新文章
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 39153
SOJSON 使用又拍云 CDN 整体架构,解决百度 SEO 方案 33
又拍云(Upyun)刷新CDN,云存储缓存 —JavaAPI 20
JS解密,JavaScript 解密,任何JS加密都能100%解密,以及JS 加密讲解 83
阿里云DNS 解析讲解,SEO配置搜索引擎线路解析 45
百度秒收录教程,怎么做到百度秒收入你的页面,SEO 教程 101
CDN 请求返回 connection reset by peer,被拦截请求解决方案 37
Google AdSense 申请技巧,谷歌广告申请通不过教程 69
Mac 安装 JMeter,JMeter 下载,JMeter Http 压力测试【图解】 51
支付宝吱口令自动复制脚本,自动复制 JavaScript 代码介绍 916
最热文章
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 39097
Elasticsearch教程(四) elasticsearch head 插件安装和使用 109124
Elasticsearch教程(六) elasticsearch Client创建 73308
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 70761
Elasticsearch教程(二),IK分词器安装 67505
Elasticsearch教程(三),IK分词器安装 (极速版) 54092
Elasticsearch教程(五) elasticsearch Mapping的创建 51628
Elasticsearch教程(一),全程直播(小白级别) 51390
Elasticsearch教程(七) elasticsearch Insert 插入数据(Java) 47779
Elasticsearch权威指南-中文.pdf,Elasticsearch 中文文档下载 40948

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

入群需要5元,如果没有QQ钱包,可以先Alipay、微信,赞助然后加群主拉进。

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

支付扫码

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

正在加载... ...