什么是BlockingQueue

https://juejin.cn/post/6999798721269465102?searchId=20250603104637E9FA8BB1E723E91AC5BF

BlockingQueue 在 Java 并发编程中扮演着至关重要的角色,它主要用于生产者-消费者模式,能够很好地解耦生产者和消费者,并处理线程间的协作。

核心特性:

  • 阻塞插入:当队列满时,尝试插入元素的线程会被阻塞,直到队列有空间。
  • 阻塞移除:当队列空时,尝试移除元素的线程会被阻塞,直到队列有元素。

Screenshot 2025-06-03 104816

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("所有任务完成。");
    }
}

LinkedBlockingQueue