Java 中的 LinkedBlockingQueue 类
LinkedBlockingQueue 是 Java.util.concurrent 中的一个线程安全的队列实现,它是一个先进先出(FIFO)的数据结构。队列中元素按照添加的顺序进行处理,因此LinkedBlockingQueue可以作为多线程环境下,数据共享的一种解决方案。
LinkedBlockingQueue 的基本用法
LinkedBlockingQueue 是一个非常常用的队列类,以下是它最基本的用法示例:
import java.util.concurrent.LinkedBlockingQueue;
public class TestLinkedBlockingQueue {
public static void main(String[] args) {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>();
// 添加元素
queue.offer("Element 1");
queue.offer("Element 2");
queue.offer("Element 3");
// 遍历元素并输出
for (String element : queue) {
System.out.println(element);
}
}
}
输出结果:
Element 1
Element 2
Element 3
从上面的示例可以看出,LinkedBlockingQueue 可以很方便地实现数据的存储和遍历。
LinkedBlockingQueue 的特点
LinkedBlockingQueue 具有以下特点:
- 队列的容量大小是没有限制的,默认是 Integer.MAX_VALUE,这就意味着在生产者不断往队列中添加元素,而消费者又不够快的情况下,LinkedBlockingQueue 可能会耗尽系统的内存。
- LinkedBlockingQueue 内部实现了两个 ReentrantLock 锁,分别用于在生产者和消费者两端实现同步机制,从而保证数据的安全性。
- LinkedBlockingQueue 类中包含了两个类型的构造函数:公平锁和非公平锁。初始化时可以选择相应的锁类型。
- LinkedBlockingQueue 队列中的元素都是存在单向链表中的,因此查询效率较低(O(n)),不适合随机访问。
LinkedBlockingQueue 的应用场景
LinkedBlockingQueue 的应用非常广泛,常见的场景如下:
- 线程池使用 LinkedBlockingQueue 存储任务,从而实现线程池的任务调度,并发控制。
- 多线程状态同步,利用队列来实现生产者消费者模式。
- 存储日志、事件等异步处理的信息。
- 实现网络服务器中的任务分配机制。
LinkedBlockingQueue 实现生产者消费者模式
LinkedBlockingQueue 是实现多线程环境下,生产者消费者模式经常使用的一种方式。示例如下:
import java.util.concurrent.LinkedBlockingQueue;
public class ProducerConsumerTest {
private static LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);
private static class Producer implements Runnable {
@Override
public void run() {
try {
while (true) {
queue.put(produce()); // 生产
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private Integer produce() {
Integer i = new Integer((int) (Math.random() * 100));
System.out.println(Thread.currentThread().getName() + " 生产了 " + i);
return i;
}
}
private static class Consumer implements Runnable {
@Override
public void run() {
try {
while (true) {
consume(queue.take()); // 消费
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void consume(Integer i) {
System.out.println(Thread.currentThread().getName() + " 消费了 " + i);
}
}
public static void main(String[] args) {
new Thread(new Producer(), "Producer 1").start();
new Thread(new Producer(), "Producer 2").start();
new Thread(new Consumer(), "Consumer 1").start();
new Thread(new Consumer(), "Consumer 2").start();
}
}
结论
LinkedBlockingQueue 是 Java.util.concurrent 中的一个线程安全的队列实现,它具有无界,同步,阻塞等特点,并且可以非常方便地实现多线程环境下的生产者消费者模式,因此在很多并发编程场景下应用广泛。但需要注意的是,LinkedBlockingQueue 在容量为无限的情况下,可能会占用大量系统内存,因此在使用时需要适当控制。