ArrayBlockingQueue 特性

  • ArrayBlockingQueue 是一个由数组支持的固定大小的有界队列。
  • 它对元素进行 FIFO(先进先出)排序。
  • 元素插入在 tail,并从队列的头部检索。
  • 一旦创建,队列的容量就不能改变。
  • 它提供阻塞插入和检索操作。
  • 它不允许 NULL 对象。
  • ArrayBlockingQueue 是线程安全的。
  • 方法 iterator() 中提供的 Iterator 按从第一个(头)到最后一个(尾)的顺序遍历元素。
  • ArrayBlockingQueue 支持可选的公平策略,用于排序等待的生产者和消费者线程。公平性设置为 true时,队列按 FIFO 顺序授予线程访问权限。
on it road .com

Java ArrayBlockingQueue 构造函数

ArrayBlockingQueue 类提供了 3 种不同的方式来构造 Java 中的队列。

  • ArrayBlockingQueue(int capacity) :构造具有给定(固定)容量和默认访问策略的空队列。
  • ArrayBlockingQueue(int capacity, boolean fair) :构造具有给定(固定)容量和指定访问策略的空队列。如果公平值是“真”,则在插入或者移除时阻塞的线程的队列访问按 FIFO 顺序处理;如果为 false,则未指定访问顺序。
  • ArrayBlockingQueue(int capacity, boolean fair, Collection c) :构造一个具有给定(固定)容量、指定访问策略并最初包含给定集合的元素的队列,以集合迭代器的遍历顺序添加。

Java ArrayBlockingQueue 示例

ArrayBlockingQueue 阻塞插入和检索示例

  • 当队列已满时,生产者线程将等待。一旦从队列中取出一个元素,它就会将该元素添加到队列中。
  • 如果队列为空,消费者线程将等待。只要队列中有一个元素,它就会取出元素。

Java 数组阻塞队列生产者消费者示例。

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
public class ArrayBlockingQueueExample 
{
    public static void main(String[] args) throws InterruptedException 
    {
        ArrayBlockingQueue<Integer> priorityBlockingQueue = new ArrayBlockingQueue<>(5);
        //Producer thread
        new Thread(() -> 
        {
            int i = 0;
            try 
            {
                while (true) 
                {
                    priorityBlockingQueue.put(++i);
                    System.out.println("Added : " + i);

                    Thread.sleep(TimeUnit.SECONDS.toMillis(1));
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        //Consumer thread
        new Thread(() -> 
        {
            try 
            {
                while (true) 
                {
                    Integer poll = priorityBlockingQueue.take();
                    System.out.println("Polled : " + poll);

                    Thread.sleep(TimeUnit.SECONDS.toMillis(2));
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

输出:

Added : 1
Polled : 1
Added : 2
Polled : 2
Added : 3
Added : 4
Polled : 3
Added : 5
Added : 6
Polled : 4
Added : 7
Added : 8
Polled : 5
Added : 9
Java ArrayBlockingQueue 类

ArrayBlockingQueue 类是由数组支持的 Java 并发和有界阻塞队列实现。
它对元素进行 FIFO(先进先出)排序。

ArrayBlockingQueue 的头部是在队列中停留时间最长的那个元素。
ArrayBlockingQueue 的 tail是排队时间最短的那个元素。
新元素插入队列 tail,队列检索操作获取队列头部元素。

Java ArrayBlockingQueue 方法

  • void put(Object o) : 在此队列的 tail插入指定的元素,如果队列已满,则等待空间变得可用。</li
  • boolean add(object) :如果可以在不超过队列容量的情况下立即在此队列的 tail插入指定的元素,则在成功时返回 true 并在此队列已满时抛出 IllegalStateException 。
  • boolean offer(object) :如果可以在不超过队列容量的情况下立即在此队列的 tail插入指定的元素,则在成功时返回 true 并在此队列已满时抛出 IllegalStateException 。
  • boolean remove(object) :从此队列中移除指定元素的单个实例(如果存在)。
  • Object peek() :检索但不删除此队列的头部,如果此队列为空,则返回 null。
  • Object poll() :检索并移除此队列的头部,如果此队列为空,则返回 null。
  • Object poll(timeout, timeUnit) :检索并删除此队列的头部,如果需要元素可用,则等待指定的等待时间。
  • Object take() :检索并移除此队列的头部,必要时等待元素变为可用。
  • void clear() :从此队列中删除所有元素。
  • boolean contains(Object o) :如果此队列包含指定的元素,则返回 true。
  • Iterator iterator() :以适当的顺序返回此队列中元素的迭代器。
  • int size() :返回此队列中的元素数。
  • int DrainTo(Collection c) :从此队列中移除所有可用元素并将它们添加到给定集合中。
  • int DrainTo(Collection c, int maxElements) :最多从此队列中移除给定数量的可用元素,并将它们添加到给定的集合中。
  • int resumeCapacity() :返回此队列在理想情况下(在没有内存或者资源限制的情况下)可以接受而不会阻塞的添加元素的数量。
  • Object[] toArray() :以适当的顺序返回一个包含此队列中所有元素的数组。
日期:2020-09-17 00:09:46 来源:oir作者:oir