📅  最后修改于: 2023-12-03 14:42:44.708000             🧑  作者: Mango
在 Java 中,BlockingQueue 是一个阻塞式的队列接口,官方文档中定义为:A Queue that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in the queue when storing an element. 即,BlockingQueue 支持阻塞式的 take() 和 put() 操作,当队列为空或者队列已满时,调用这两个方法时会一直阻塞等待相应的事件发生,直到阻塞被解除。
在 BlockingQueue 接口中,add(E e) 是向队列中添加元素的操作,它会将元素添加到队列的尾部。如果队列已经满了,add() 操作将抛出一个异常(IllegalStateException 或者 IllegalArgumentException)。
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueDemo {
public static void main(String[] args) throws InterruptedException {
int capacity = 10;
BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(capacity);
// 添加元素到队列
for (int i = 0; i < capacity + 1; i++) {
try {
blockingQueue.add(i);
System.out.println("add " + i + " to blockingQueue");
} catch (Exception e) {
System.out.println("add " + i + " to blockingQueue failed: " + e.getClass().getName());
}
}
}
}
当 capacity + 1 个元素被添加到队列中后,add() 方法会抛出异常:
add 0 to blockingQueue
add 1 to blockingQueue
add 2 to blockingQueue
add 3 to blockingQueue
add 4 to blockingQueue
add 5 to blockingQueue
add 6 to blockingQueue
add 7 to blockingQueue
add 8 to blockingQueue
add 9 to blockingQueue
add 10 to blockingQueue failed: java.lang.IllegalStateException
BlockingQueue 接口提供了一种阻塞式的队列操作,可以在队列为空或已满的情况下阻塞等待相应的事件。add() 方法是向队列中添加元素的操作,如果队列已经满了,则会抛出异常。在使用 BlockingQueue 接口时,需要注意队列容量的大小,避免队列已满导致的异常。