关闭

Java LinkedBlockingQueue 分析

970人阅读 评论(0) 收藏 举报
分类:
package java.util.concurrent
public class LinkedBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable


线程安全的链式阻塞队列

内部有个static class Node<E> 实现链式结构


构造函数

    /**
     * Creates a {@code LinkedBlockingQueue} with a capacity of
     * {@link Integer#MAX_VALUE}.
     */
    public LinkedBlockingQueue() {
        this(Integer.MAX_VALUE);
    }

    /**
     * Creates a {@code LinkedBlockingQueue} with the given (fixed) capacity.
     *
     * @param capacity the capacity of this queue
     * @throws IllegalArgumentException if {@code capacity} is not greater
     *         than zero
     */
    public LinkedBlockingQueue(int capacity) {
        if (capacity <= 0) throw new IllegalArgumentException();
        this.capacity = capacity;
        last = head = new Node<E>(null);
    }

    /**
     * Creates a {@code LinkedBlockingQueue} with a capacity of
     * {@link Integer#MAX_VALUE}, initially containing the elements of the
     * given collection,
     * added in traversal order of the collection's iterator.
     *
     * @param c the collection of elements to initially contain
     * @throws NullPointerException if the specified collection or any
     *         of its elements are null
     */
    public LinkedBlockingQueue(Collection<? extends E> c) {
        this(Integer.MAX_VALUE);
        final ReentrantLock putLock = this.putLock;
        putLock.lock(); // Never contended, but necessary for visibility
        try {
            int n = 0;
            for (E e : c) {
                if (e == null)
                    throw new NullPointerException();
                if (n == capacity)
                    throw new IllegalStateException("Queue full");
                enqueue(new Node<E>(e));
                ++n;
            }
            count.set(n);
        } finally {
            putLock.unlock();
        }
    }

可以设置队列的长度,默认为Integer.MAX_VALUE

或从一个Collection,创建LinkedBlockingQueue


内部的锁和相关条件

 /** Lock held by take, poll, etc */
    private final ReentrantLock takeLock = new ReentrantLock();

    /** Wait queue for waiting takes */
    private final Condition notEmpty = takeLock.newCondition();

    /** Lock held by put, offer, etc */
    private final ReentrantLock putLock = new ReentrantLock();

    /** Wait queue for waiting puts */
    private final Condition notFull = putLock.newCondition();

数据元素操作

add、remove

   add会调用offer();

   add:添加元素, 返回是否操作成功的boolean标识。  链表未满才可添加

   remove:删除元素,返回是否操作成功的boolean标识。  链表未空才可删除

offer、poll

    offer:添加元素, 返回是否操作成功的boolean标识。  链表未满才可添加

    poll:删除元素,返回被删除的元素。若无元素被删除,返回null

put、take

    put:阻塞式添加元素,当链表满了,阻塞线程。

    take:阻塞式删除元素,当链表空了,阻塞线程。 返回移除的元素。


LinkedBlockingQueue 是一个先进先出(FIFO)的阻塞式队列

添加时,会加到链尾

移除时,会移除链头


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

LinkedBlockingQueue的api

/** * add方法在添加元素的时候,若超出了度列的长度会直接抛出异常: * put方法,若向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间,以加入元素。 * offer方法在...
  • chang_li
  • chang_li
  • 2016-12-26 15:21
  • 1172

java LinkedBlockingQueue

LinkedBlockingQueue介绍 LinkedBlockingQueue是一个单向链表实现的阻塞队列。该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操...
  • qilixiang012
  • qilixiang012
  • 2015-04-05 01:44
  • 1437

【Java并发编程】LinkedBlockingQueue的使用(六)

http://blog.csdn.net/liulongling/article/details/50596624
  • u013322876
  • u013322876
  • 2016-08-08 22:25
  • 221

【Java并发编程】LinkedBlockingQueue的使用(六)

我是小毛驴,一个游戏人,我的梦想是世界和平。原文地址:http://blog.csdn.net/liulongling/article/details/50596624  一、LinkedBlock...
  • liulongling
  • liulongling
  • 2016-01-27 21:01
  • 5302

java使用LinkedBlockingQueue实现 生产者 消费者模式

LinkedBlockingQueue LinkedBlockingQueue实现是线程安全的,实现了FIFO(先进先出)等特性. 是作为生产者消费者的首选,LinkedBlockingQueue ...
  • hpccn
  • hpccn
  • 2013-12-26 12:25
  • 5468

用阻塞队列LinkedBlockingQueue实现生产者消费者先进先出

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ...
  • done58
  • done58
  • 2016-03-28 11:18
  • 2441

java多线程并发处理之阻塞队列LinkedBlockingQueue用法

java多线程并发处理之阻塞队列LinkedBlockingQueue用法
  • chenjian0415
  • chenjian0415
  • 2016-08-23 09:05
  • 1279

LinkedBlockingQueue阻塞队列offer()操作抛出中断异常

说明 在使用LinkedBlockingQueue的offer方法时,出现了中断异常,现分析一下出现这个中断异常的原因。 会产生中断异常的Demo import java.util.concur...
  • qq1332479771
  • qq1332479771
  • 2017-06-28 00:12
  • 453

进阶篇:同步阻塞队列之LinkedBlockingQueue(十一)

JDK为我们提供了多个阻塞队列的实现,什么是阻塞队列呢? 我们都知道队列就是一组数据的集合,而阻塞队列的意思是,当你往队列中取数据时,如果没有数据,你将被阻塞,一直等到拿到数据为止; 今天我们就来看一...
  • cy_Alone
  • cy_Alone
  • 2017-04-12 22:10
  • 506

结合多线程实例谈一谈LinkedBlockingQueue的原理

多线程以及linkedBlockingqueue分析
  • chenpengfei1990
  • chenpengfei1990
  • 2016-11-30 17:55
  • 251
    个人资料
    • 访问:1349406次
    • 积分:13643
    • 等级:
    • 排名:第1088名
    • 原创:341篇
    • 转载:6篇
    • 译文:10篇
    • 评论:240条
    博客专栏
    最新评论
      QQ交流群: 473876194
      QQ交流群