BlockingQueue 方法详细描述

JSON 2016-08-22 17:57:13 7927

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

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

本文主题:

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

关于作者
一个低调而闷骚的男人。
相关文章
Spring JPA查询,JPA 根据方法名字查询详细介绍
解JavaScript中splice()方法,有Demo详细介绍
Maven的Mirror和Repository 的详细讲解
HttpClient 获取详细的头信息
Urlrewrite Java 伪静态 urlrewrite.xml 配置参数描述
Linux 安装 Redis 详细步骤讲解
如何解析JSON数据(详细解答)
Ehcache配置详细解释
document.domain解决跨域问题,详细讲解。
条形码生成是什么原理(详细解答)
最新文章
C语言的变量和常量 30
PHP变量剖析 113
SQL全外连接剖析 276
SQL自然连接剖析 184
springboot启动原理 416
SQL右连接【RIGHT JOIN】详解及图解 467
SQL左链接【LEFT JOIN】详解及图解 396
SQL非等值连接剖析 285
SQL等链接剖析 291
SQL内连接详解及图解 417
最热文章
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 680200
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 674611
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 599938
免费天气API,天气JSON API,不限次数获取十五天的天气预报 568752
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 552071
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 509262
Elasticsearch教程(四) elasticsearch head 插件安装和使用 479677
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 263374
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 244147
Elasticsearch教程(一),全程直播(小白级别) 225245
支付扫码

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

查看我的收藏

正在加载... ...