BlockingQueue 方法详细描述

信息发布:soゝso 发布日期:2016-08-22 17:57 热度:453 分享到:

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


本文主题

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

¥我需要走的更远,点击我 赞助。 如果还有疑问,点击我加群,为你提供最好的解答。


工具导航地图

 
Nodejs + socket Demo 赞助二维码 赞助名单 百度口碑点赞 查看QQ群美女帅哥 点击加QQ群 听音乐 开启弹幕 X
反馈意见