📜  Java中的 ArrayBlockingQueue 类(1)

📅  最后修改于: 2023-12-03 15:31:49.791000             🧑  作者: Mango

Java中的 ArrayBlockingQueue 类

ArrayBlockingQueue 是 Java 中的一个阻塞队列,它是 BlockingQueue 接口的实现类之一。它按照先进先出 (FIFO) 的顺序存储元素,并限制队列大小。如果队列已满,则插入操作将被阻塞,直到空闲空间可用为止,如果队列为空,则获取操作将被阻塞,直到有元素可获取为止。

基本用法

以下是 ArrayBlockingQueue 的基本用法:

首先,我们需要导入 java.util.concurrent 包:

import java.util.concurrent.ArrayBlockingQueue;

然后,我们需要创建一个 ArrayBlockingQueue,指定队列大小:

ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(10);

这将创建一个大小为 10 的 ArrayBlockingQueue

接下来,我们可以向队列中添加元素,使用 put() 方法:

queue.put("a");
queue.put("b");
queue.put("c");

这将按照先进先出的顺序将元素添加到队列中。

我们也可以使用 take() 方法从队列中获取元素:

System.out.println(queue.take()); // 输出 "a"
System.out.println(queue.take()); // 输出 "b"
System.out.println(queue.take()); // 输出 "c"

如果队列为空,take() 方法将一直阻塞,直到队列中有元素可获取。

构造函数

ArrayBlockingQueue 有多个构造函数可用,以下是其中几个:

public ArrayBlockingQueue(int capacity)

该构造函数创建一个大小为 capacityArrayBlockingQueue

public ArrayBlockingQueue(int capacity, boolean fair)

该构造函数创建一个大小为 capacityArrayBlockingQueue,并指定是否使用公平模式。如果 fairtrue,则等待时间较长的线程将优先获得锁。否则,锁的获取顺序是不确定的。默认情况下,它是不公平的。

阻塞操作

ArrayBlockingQueue 实现了 BlockingQueue 接口,因此它还提供了许多阻塞操作。以下是其中的一些:

public void put(E e) throws InterruptedException

将元素插入队列,如果队列已满,则将阻塞直到空闲空间可用。

public E take() throws InterruptedException

从队列中获取并移除头部元素,如果队列为空,则将阻塞直到有元素可用。

public boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException

将元素插入队列,在等待指定的时间内等待空闲插槽,如果达到超时时间元素仍未插入,则返回 false

public E poll(long timeout, TimeUnit unit) throws InterruptedException

获取并移除一个元素,在等待指定的时间内等待元素可用,如果达到超时时间仍未获取到元素,则返回 null

线程安全

ArrayBlockingQueue 是线程安全的,它使用锁来确保多个线程可以同时访问队列。

总结

ArrayBlockingQueue 是 Java 中的一个阻塞队列,它提供了按照先进先出的顺序存储元素,并限制队列大小的功能。它是线程安全的,提供了许多阻塞操作,适用于多线程编程中。