阻塞队列是一种支持阻塞操作的队列,常用于多线程编程中,协调生产者和消费者的速度差异。
核心特点
-
阻塞操作:
- 队列为空时:消费者线程会被阻塞,直到队列中有新元素。
- 队列满时:生产者线程会被阻塞,直到队列有空闲空间。
-
线程安全:内部通过锁或其他机制确保线程安全,避免并发问题。
常见实现
- Java:
java.util.concurrent
包中的ArrayBlockingQueue
、LinkedBlockingQueue
等。 - Python:
queue
模块中的Queue
。
主要作用
- 解耦生产者和消费者:允许它们独立运行,通过队列进行数据交换。
- 流量控制:通过阻塞机制防止生产者过快导致消费者过载,或消费者过快导致生产者资源浪费。
- 任务调度:常用于线程池,管理待执行的任务。
示例代码(Java)
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueExample {
public static void main(String[] args) throws InterruptedException {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
// 生产者线程
Thread producer = new Thread(() -> {
try {
for (int i = 0; i < 15; i++) {
queue.put("Message " + i);
System.out.println("Produced: Message " + i);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
// 消费者线程
Thread consumer = new Thread(() -> {
try {
for (int i = 0; i < 15; i++) {
String message = queue.take();
System.out.println("Consumed: " + message);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
producer.start();
consumer.start();
producer.join();
consumer.join();
}
}
总结
阻塞队列通过阻塞机制有效协调生产者和消费者,适用于需要流量控制和任务调度的场景。