`
guzizai2007
  • 浏览: 359588 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ArrayBlockingQueue

 
阅读更多

java.util.concurrent

类 ArrayBlockingQueue<E>

java.lang.Object
java.util.AbstractCollection<E>  
java.util.AbstractQueue<E>

         继承者 java.util.concurrent.ArrayBlockingQueue<E>

 

       一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素。

       这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。

       底层是通过数组来实现的一个有界阻塞队列。

       相当与一个有界缓存区,当向已满队列中存放元素会导致操作阻塞,直到队列非满

       当从已空队列中提取元素也会阻塞,直到队列非空。


  /** 存放元素的数组,final类型,表示数组不可变  不能扩容之类的 */

  final Object[] items;

 

  /** 下一个获取、删除元素的索引位 items index for next take, poll, peek or remove */

  int takeIndex;

 

  /** 下一个新增元素的索引位 items index for next put, offer, or add */

  int putIndex;

 

  /** 队列中元素个数 */

  int count;

  /** 读写操作锁 */

  final ReentrantLock lock;

  /** 获取元素操作的条件 */

  private final Condition notEmpty;

  /** 插入元素操作的条件 */

  private final Condition notFull;

构造函数:

public ArrayBlockingQueue(int capacity, boolean fair) {

      if (capacity <= 0)

          throw new IllegalArgumentException();

      this.items = new Object[capacity];  //初始化数组容量

      lock = new ReentrantLock(fair);  //公平锁 or 非公平锁

      notEmpty = lock.newCondition();  

      notFull =  lock.newCondition();

}

新增元素:

public boolean offer(E e) {

      checkNotNull(e);    //非空检查

      final ReentrantLock lock = this.lock;  

      lock.lock();   //上锁

      try {

          if (count == items.length)  //判断是否队列已满

              return false;

          else {    //未满

              insert(e);  //插入

              return true;

          }

      } finally {

          lock.unlock();  //释放锁

      }

}

private void insert(E x) {

      items[putIndex] = x;

      putIndex = inc(putIndex);  //判断putIndex是否已到队列尾 如果是则从0开始

      ++count;//数量+1

      notEmpty.signal();//唤醒非空条件下的线程

}

final int inc(int i) {

      return (++i == items.length) ? 0 : i;  //如果到队尾,则从0开始

}

可阻塞新增元素:

public void put(E e) throws InterruptedException {

      checkNotNull(e);

      final ReentrantLock lock = this.lock;

      lock.lockInterruptibly();  //可响应线程打断

      try {

          while (count == items.length)   //不断轮循判断  是否非满  如果满  则线程等待

              notFull.await();  //await里面让线程进入当前条件的等待队列中 并释放锁  然后会自旋(while)挂起,直到被唤醒或者超时或者CACELLED,继而获取锁

          insert(e);  //条件满足后 插入 并唤醒 删除 操作线程

      } finally {

          lock.unlock();

      }

}

移除元素:

public E poll() {

      final ReentrantLock lock = this.lock;

      lock.lock();

      try {

          return (count == 0) ? null : extract();  //如果队列为空,则返回null

      } finally {

          lock.unlock();

      }

}

private E extract() {

      final Object[] items = this.items;

      E x = this.<E>cast(items[takeIndex]);  //获取takeIndex位置元素

      items[takeIndex] = null;  //赋值为null  gc

      takeIndex = inc(takeIndex); //takeIndex自增  如果到队列尾,则从头开始

      --count;  //元素数量自减

      notFull.signal(); //唤醒非满条件线程  表示可以做新增操作

      return x;

}

可阻塞删除元素:

public E take() throws InterruptedException {

      final ReentrantLock lock = this.lock;

      lock.lockInterruptibly();  //响应线程打断

      try {

          while (count == 0)

              notEmpty.await();  //阻塞

          return extract();  //移除元素 并唤醒非满条件线程  

      } finally {

          lock.unlock();

      }

}

 

参考:http://blog.csdn.net/longeremmy/article/details/8230264

           http://www.blogjava.net/xylz/archive/2010/07/27/327265.html

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    ArrayBlockingQueue源码分析.docx

    `ArrayBlockingQueue` 是 Java 中实现并发编程时常用的一个线程安全的数据结构,它是一个有界的阻塞队列。在 `java.util.concurrent` 包下,`ArrayBlockingQueue` 继承自 `java.util.concurrent.BlockingQueue` 接口...

    ArrayBlockingQueue源码解析-动力节点共

    ArrayBlockingQueue是Java并发编程中一个重要的数据结构,它是Java并发包`java.util.concurrent`中的一个线程安全的阻塞队列。这个队列基于数组实现,提供了在生产者和消费者之间进行数据交换的能力,同时确保了线程...

    并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解

    "并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解" ArrayBlockingQueue和LinkedBlockingQueue是Java并发容器中两个常用的阻塞队列实现,分别基于数组和链表存储元素。它们都继承自AbstractQueue类...

    26不让我进门,我就在门口一直等!—BlockingQueue和ArrayBlockingQueue.pdf

    —BlockingQueue和ArrayBlockingQueue.pdf” 【描述】:此文档是关于Java并发编程的学习资料,以漫画形式讲解,聚焦于Java并发编程中的核心概念——BlockingQueue接口及其具体实现ArrayBlockingQueue。 【标签】:...

    详细分析Java并发集合ArrayBlockingQueue的用法

    Java并发集合ArrayBlockingQueue的用法详解 Java并发集合ArrayBlockingQueue是Java并发集合框架下的一个重要组件,它提供了阻塞队列的实现,用于多线程环境下的并发操作。下面是对ArrayBlockingQueue的用法详解: ...

    java并发之ArrayBlockingQueue详细介绍

    Java并发之ArrayBlockingQueue详细介绍 ArrayBlockingQueue是Java并发编程中常用的线程安全队列,经常被用作任务队列在线程池中。它是基于数组实现的循环队列,具有线程安全的实现。 ArrayBlockingQueue的实现 ...

    Java源码解析阻塞队列ArrayBlockingQueue常用方法

    Java中的ArrayBlockingQueue是一个高效的并发数据结构,它是Java并发包`java.util.concurrent`下的一个阻塞队列。本文将深入解析ArrayBlockingQueue的常用方法及其内部实现机制。 ArrayBlockingQueue的核心是一个...

    Java concurrency集合之ArrayBlockingQueue_动力节点Java学院整理

    ArrayBlockingQueue是Java并发编程中一个重要的集合类,它属于 BlockingQueue 接口的一个实现,主要特点是线程安全、有界以及基于数组的阻塞队列。线程安全得益于其内部使用了Java并发包中的ReentrantLock(可重入锁...

    java中LinkedBlockingQueue与ArrayBlockingQueue的异同

    Java中的`LinkedBlockingQueue`和`ArrayBlockingQueue`都是`java.util.concurrent`包下的线程安全队列,它们都实现了`BlockingQueue`接口,提供了一种高效、线程安全的数据同步方式。这两种队列在很多方面都有相似之...

    Java源码解析阻塞队列ArrayBlockingQueue介绍

    Java源码解析阻塞队列ArrayBlockingQueue介绍 Java源码解析阻塞队列ArrayBlockingQueue介绍是Java中的一种阻塞队列实现,使用ReentrantLock和Condition来实现同步和阻塞机制。本文将对ArrayBlockingQueue的源码进行...

    Java源码解析阻塞队列ArrayBlockingQueue功能简介

    Java源码解析阻塞队列ArrayBlockingQueue功能简介 ArrayBlockingQueue是Java中一个重要的阻塞队列实现,它基于数组实现了有界阻塞队列,提供FIFO(First-In-First-Out)功能。该队列的头元素是最长时间呆在队列中的...

    Java可阻塞队列-ArrayBlockingQueue

    在前面的的文章,写了一个带有缓冲区的队列,是用JAVA的Lock下的Condition实现的,但是JAVA类中提供了这项功能,是ArrayBlockingQueue,  ArrayBlockingQueue是由数组支持的有界阻塞队列,次队列按照FIFO(先进先...

    spring-blockingqueue:用Spring Boot阻止队列

    通常,我们会选择实现BlockingQueue的类,如ArrayBlockingQueue、LinkedBlockingQueue或PriorityBlockingQueue,根据实际需求选择合适的实现。 例如,我们可以创建一个配置类,如下所示: ```java @Configuration ...

    阻塞队列阻塞队列阻塞队列

    ArrayBlockingQueue支持公平和非公平两种策略,公平策略意味着等待最久的线程优先获得资源,而非公平策略则不保证这一点。在高并发场景下,非公平策略通常能提供更好的性能。 2. LinkedBlockingQueue ...

    生产者消费者问题java

    ArrayBlockingQueue&lt;Integer&gt; queue = new ArrayBlockingQueue(10); Thread producer = new Thread(new Producer(queue)); Thread consumer = new Thread(new Consumer(queue)); producer.start(); consumer....

    JAVA并发编程深度学习-无锁并行计算框架1

    本节我们将深入探讨Disruptor框架以及与ArrayBlockingQueue的对比。 ArrayBlockingQueue是Java并发库中的一个阻塞队列实现,基于循环数组,提供了线程安全的入队和出队操作。在上述代码中,我们创建了一个固定大小...

Global site tag (gtag.js) - Google Analytics