如何理解 Java 中的阻塞队列:从基础到高级的深度解析
在Java中,阻塞队列是一个支持两个附加操作的队列:
take
方法可以阻塞,直到队列中有元素可用。put
方法可以阻塞,直到队列中有空间可用。
这里是一个简单的实现示例,使用 ArrayBlockingQueue
作为阻塞队列:
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueExample {
public static void main(String[] args) {
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);
// 生产者线程
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
queue.put(i); // 如果队列已满,这里会阻塞等待
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
}).start();
// 消费者线程
new Thread(() -> {
while (true) {
try {
int value = queue.take(); // 如果队列为空,这里会阻塞等待
System.out.println(value);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
}).start();
}
}
在这个例子中,我们创建了一个容量为10的 ArrayBlockingQueue
。生产者线程使用 put
方法向队列中添加元素,如果队列已满,则阻塞等待直到队列中有空间。消费者线程使用 take
方法从队列中取出元素,如果队列为空,则阻塞等待直到队列中有元素可取。这样,生产者和消费者可以以协调一致的方式工作,不会超出队列的容量限制,也不会因为队列为空而频繁等待。
评论已关闭