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
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