📌  相关文章
📜  Java LinkedBlockingQueue(1)

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

Java LinkedBlockingQueue

LinkedBlockingQueue 是 Java 中的一个阻塞队列,实现了 BlockingQueue 接口。LinkedBlockingQueue 的内部实现是一个链表,可以设置最大容量,如果没有设置,则默认最大容量为 Integer.MAX_VALUE

基本使用
创建队列

可以通过以下两种方式创建一个 LinkedBlockingQueue

LinkedBlockingQueue<String> queue1 = new LinkedBlockingQueue<>(); // 默认最大容量为 Integer.MAX_VALUE
LinkedBlockingQueue<String> queue2 = new LinkedBlockingQueue<>(10); // 最大容量为 10
添加元素

使用 add() 方法或 offer() 方法可以向队列中添加元素,如果队列已满,add() 方法会抛出一个 IllegalStateException,而 offer() 方法则会返回 false。

LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(2);
queue.add("A");
queue.offer("B");
queue.add("C"); // 抛出 IllegalStateException
移除元素

使用 remove() 方法或 poll() 方法可以从队列中移除元素,如果队列为空,remove() 方法会抛出一个 NoSuchElementException,而 poll() 方法则会返回 null。

LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(2);
queue.offer("A");
queue.offer("B");
queue.remove(); // 移除并返回 A
queue.poll(); // 移除并返回 B
queue.poll(); // 返回 null
获取元素

使用 peek() 方法或 element() 方法可以返回队列的头元素,但是不会从队列中移除该元素。如果队列为空,element() 方法会抛出一个 NoSuchElementException,而 peek() 方法则会返回 null。

LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(2);
queue.offer("A");
queue.offer("B");
queue.element(); // 返回 A
queue.peek(); // 返回 A
queue.remove();
queue.element(); // 返回 B
阻塞操作
put()

使用 put() 方法可以向队列中放入元素。如果队列已满,则该方法会一直阻塞直到队列有空位。

LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(2);
queue.put("A");
queue.put("B");
queue.put("C"); // 阻塞等待有空位
take()

使用 take() 方法可以从队列中取出元素。如果队列为空,则该方法会一直阻塞直到队列中有元素。

LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(2);
queue.put("A");
queue.put("B");
String first = queue.take();
String second = queue.take();
String third = queue.take(); // 阻塞等待有元素
链接