📅  最后修改于: 2023-12-03 15:15:56.844000             🧑  作者: Mango
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()
方法可以向队列中放入元素。如果队列已满,则该方法会一直阻塞直到队列有空位。
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(2);
queue.put("A");
queue.put("B");
queue.put("C"); // 阻塞等待有空位
使用 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(); // 阻塞等待有元素