什么是BlockingQueue
https://juejin.cn/post/6999798721269465102?searchId=20250603104637E9FA8BB1E723E91AC5BF
BlockingQueue 在 Java 并发编程中扮演着至关重要的角色,它主要用于生产者-消费者模式,能够很好地解耦生产者和消费者,并处理线程间的协作。
核心特性:
- 阻塞插入:当队列满时,尝试插入元素的线程会被阻塞,直到队列有空间。
- 阻塞移除:当队列空时,尝试移除元素的线程会被阻塞,直到队列有元素。
ArrayBlockingQueue
参考这个
https://www.cnblogs.com/luorongxin/p/18566875
ArrayBlockingQueue 是 Java 中 java.util.concurrent 包下的一个阻塞队列实现,底层基于数组,是线程安全的。它是一个 有界队列,需要在创建时指定容量大小。此类的主要特性包括:
线程安全:
使用 独占锁(ReentrantLock) 和 条件变量 来实现线程安全的操作。
先进先出(FIFO):
元素按插入顺序排列,头部是最先插入的元素,尾部是最后插入的元素。
有界性:
队列容量固定,不能超过初始化时指定的大小。
package cn.meowrain.blockingqueuetest;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
/**
* 非常好类
*/
public class ArrayBlockTest {
public static void main(String[] args) {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(5);
Thread producer = new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
String item = "item-" + i;
queue.put(item);
System.out.println("生产者已生产 " + item + " 当前队列大小:" + queue.size());
}
queue.put("Done");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println("生产者线程被中断");
}
});
Thread consumer = new Thread(() -> {
try {
String item;
while (!((item = queue.take()).equals("Done"))) {
System.out.println("消费者: 消费了 " + item + ", 当前队列大小: " + queue.size());
TimeUnit.MILLISECONDS.sleep(1000); // 模拟消费耗时
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("消费者线程被中断");
}
});
producer.start();
consumer.start();
try {
producer.join();
consumer.join();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println("主线程等待时被中断");
}
System.out.println("所有任务完成。");
}
}