📅  最后修改于: 2023-12-03 15:31:49.791000             🧑  作者: Mango
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)
该构造函数创建一个大小为 capacity
的 ArrayBlockingQueue
。
public ArrayBlockingQueue(int capacity, boolean fair)
该构造函数创建一个大小为 capacity
的 ArrayBlockingQueue
,并指定是否使用公平模式。如果 fair
为 true
,则等待时间较长的线程将优先获得锁。否则,锁的获取顺序是不确定的。默认情况下,它是不公平的。
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 中的一个阻塞队列,它提供了按照先进先出的顺序存储元素,并限制队列大小的功能。它是线程安全的,提供了许多阻塞操作,适用于多线程编程中。