什么是阻塞队列BlockingQueue是 Java 并发包java.util.concurrent中的核心接口它继承自Queue支持在队列满时阻塞插入操作、在队列空时阻塞移除操作。它是实现生产者-消费者模式的标准工具。核心特性操作类型抛出异常返回特殊值阻塞等待超时退出插入add(e)offer(e)put(e)offer(e, time, unit)移除remove()poll()take()poll(time, unit)检查element()peek()不可用不可用主要实现类1.ArrayBlockingQueue— 有界数组队列// 基于数组的有界阻塞队列FIFOBlockingQueueStringqueuenewArrayBlockingQueue(100);// 公平锁模式可选按等待时间排序获取锁BlockingQueueStringfairQueuenewArrayBlockingQueue(100,true);底层循环数组 单锁ReentrantLock特点必须指定容量内存紧凑适合固定容量场景2.LinkedBlockingQueue— 链表队列// 无界队列默认 Integer.MAX_VALUEBlockingQueueStringunboundednewLinkedBlockingQueue();// 有界队列BlockingQueueStringboundednewLinkedBlockingQueue(1000);底层单向链表 双锁队头锁 队尾锁特点吞吐量通常高于 ArrayBlockingQueue无界时注意内存溢出3.PriorityBlockingQueue— 优先级队列BlockingQueueTaskqueuenewPriorityBlockingQueue(100,Comparator.comparing(Task::getPriority).reversed());底层堆数组 单锁特点元素必须实现Comparable或提供Comparator4.DelayQueue— 延迟队列BlockingQueueDelayedTaskqueuenewDelayQueue();// 元素必须实现 Delayed 接口特点元素只有到期后才能被取出常用于缓存过期、定时任务5.SynchronousQueue— 同步队列BlockingQueueStringqueuenewSynchronousQueue();特点不存储元素每个插入必须等待一个移除反之亦然吞吐量最高用于直接传递场景6.LinkedTransferQueue— 传输队列Java 7TransferQueueStringqueuenewLinkedTransferQueue();// 特有方法直接传递避免入队queue.transfer(item);// 阻塞直到被消费queue.tryTransfer(item);// 立即返回特点结合了 SynchronousQueue 和 LinkedBlockingQueue 的优势经典生产者-消费者示例publicclassProducerConsumer{privatestaticfinalBlockingQueueIntegerqueuenewLinkedBlockingQueue(10);staticclassProducerimplementsRunnable{publicvoidrun(){try{for(inti0;i100;i){queue.put(i);// 队列满时自动阻塞System.out.println(生产: i);}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}}staticclassConsumerimplementsRunnable{publicvoidrun(){try{while(!Thread.interrupted()){Integeritemqueue.take();// 队列空时自动阻塞System.out.println(消费: item);}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}}publicstaticvoidmain(String[]args){ExecutorServiceexecutorExecutors.newFixedThreadPool(2);executor.submit(newProducer());executor.submit(newConsumer());executor.shutdown();}}选择指南场景推荐实现固定容量、内存敏感ArrayBlockingQueue高并发、双锁优化LinkedBlockingQueue任务优先级调度PriorityBlockingQueue定时/延迟任务DelayQueue直接传递、无缓冲SynchronousQueue需要直接传递语义LinkedTransferQueue线程池中的应用Java 线程池的核心组件就是阻塞队列ThreadPoolExecutorexecutornewThreadPoolExecutor(5,// 核心线程数10,// 最大线程数60L,TimeUnit.SECONDS,// 空闲线程存活时间newLinkedBlockingQueue(100),// 任务队列newThreadPoolExecutor.CallerRunsPolicy()// 拒绝策略);阻塞队列是 Java 并发编程的基础设施理解其特性和适用场景对编写高效、可靠的并发程序至关重要。