BlockingQueue 方法详细描述

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

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

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

本文主题:

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

相关文章
BlockingQueue 方法详细描述
解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多个上传按钮
最新文章
Macbook teamviewer 突破5分钟,苹果电脑重置 Mac 地址,100%解决限制 271
腾讯云代金券 10000 元/ 30000 代金券领取技巧 351
SEO 换友情链接的主意事项,友情链接断链、友情链接套路说明 236
Springboot + Mybatis,数据库多数据源配置项目Demo【源码下载】 1934
Mac mtr 安装并使用,mrt: command not found 301
Java 集成阿里云消息队列,日志消息存储 501
域名备案注意事项,网站域名ICP备案快速通过攻略【干货分享】 487
Springboot 集成Aliyun MQ消息队列,Aliyun 消息队列配置及代码实现 842
SpringBoot 集成Spring-data-redis,redis对象序列化存储 2050
天气API,全国天气 JSON API接口,可以获取十五天的天气预报 616
最热文章
Elasticsearch教程(四) elasticsearch head 插件安装和使用 126843
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 108648
Elasticsearch教程(六) elasticsearch Client创建 78834
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 74451
Elasticsearch教程(二),IK分词器安装 73235
Elasticsearch教程(一),全程直播(小白级别) 65840
Elasticsearch教程(五) elasticsearch Mapping的创建 61925
Elasticsearch教程(三),IK分词器安装 (极速版) 56373
Elasticsearch教程(七) elasticsearch Insert 插入数据(Java) 53569
Java 解析JSON,JSON-LIB jar包下载和使用。 49041

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

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

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

支付扫码

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

正在加载... ...