ArrayBlockingQueue用法
时间: 2023-06-01 12:07:32 浏览: 53
ArrayBlockingQueue是一个基于数组实现的有界阻塞队列,它可以保证先进先出的顺序,并且支持线程安全的并发访问。使用该类需要先指定队列的容量,当队列已满时,新元素的插入操作会被阻塞,直到有元素被移除。同时,当队列为空时,获取元素的操作也会被阻塞,直到有新元素被插入。该类的主要方法包括add、put、take、remove等。
相关问题
java ArrayBlockingQueue 使用例子
好的,可以为您提供一个简单的Java ArrayBlockingQueue使用例子:
```
import java.util.concurrent.ArrayBlockingQueue;
public class ArrayBlockingQueueExample {
public static void main(String[] args) {
// 创建一个容量为3的数组阻塞队列
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
// 添加元素到队列
queue.add("Java");
queue.offer("Python");
try {
// 尝试添加一个元素,但队列已满,因此将会被阻塞
queue.put("C++");
} catch (InterruptedException e) {
e.printStackTrace();
}
// 队列已满,再次添加元素将会抛出异常
try {
queue.add("Ruby");
} catch (IllegalStateException e) {
System.out.println("队列已满!");
}
// 从队列中获取并移除头部元素
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
// 队列中已没有元素,再次获取元素将返回null
System.out.println(queue.poll());
}
}
```
这个例子创建了一个容量为3的ArrayBlockingQueue对象,首先添加了两个元素 Java 和 Python。然后尝试向队列中添加一个元素 C++,但这个队列已满,因此该方法将会被阻塞,直到队列中有空间可用。
接着尝试再次添加一个元素 Ruby,但由于队列已满,该操作将会抛出IllegalStateException异常。
最后,我们从队列中获取并移除了头部的三个元素,然后再次尝试获取一个元素,但由于队列已空,该操作将返回null。
希望这个例子对您有所帮助!
ArrayBlockingQueue
ArrayBlockingQueue是一个阻塞式的队列,底层以数组的形式保存数据。它的元素访问可以是公平的或非公平的。对于公平访问队列,被阻塞的线程可以按照阻塞的先后顺序访问队列。而非公平队列,当队列可用时,阻塞的线程将进入争夺访问资源的竞争中,谁先抢到谁就执行,没有固定的先后顺序。创建公平与非公平阻塞队列的代码如下:
//默认非公平阻塞队列
ArrayBlockingQueue queue = new ArrayBlockingQueue(2);
//公平阻塞队列
ArrayBlockingQueue queue1 = new ArrayBlockingQueue(2,true)
ArrayBlockingQueue提供了常用的操作,包括add,offer,put,remove,poll,take,peek等方法。其中,peek方法返回当前队列的头元素但不删除任何元素。
LinkedBlockingQueue是一个由链表实现的有界队列阻塞队列,默认大小为Integer.MAX_VALUE。它的构造函数可以手动传入大小值,避免队列过大造成机器负载或内存爆满等情况。LinkedBlockingQueue也提供了常用的操作,类似于ArrayBlockingQueue。
总结来说,ArrayBlockingQueue和LinkedBlockingQueue都是阻塞队列,但底层实现不同,一个是数组,一个是链表。它们的使用方式和特点略有不同,具体选择哪个取决于具体的需求和场景。