亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

Java BlockingQueue:线程安全的阻塞队列与生产者消费者模式

Java BlockingQueue

本指南探讨 Java BlockingQueue 接口、实现类、方法分类及实战用法。

BlockingQueue 接口属于 Java 集合框架,继承 Queue 并增加阻塞行为。插入和移除操作会自动等待,直到队列状态允许该操作。

例如,从空队列移除元素会阻塞调用线程,直到有元素可用,从而确保生产者与消费者间的安全协调。


具体实现类

因 BlockingQueue 是接口,具体类提供实际功能:

Java BlockingQueue:线程安全的阻塞队列与生产者消费者模式


使用 BlockingQueue

创建实例前先导入包:

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

示例实例:

// 数组实现的 BlockingQueue
BlockingQueue<String> animal1 = new ArrayBlockingQueue<>(10);
// 链表实现的 BlockingQueue
BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();

两个对象均支持 BlockingQueue 接口定义的所有方法。


方法分类

BlockingQueue 方法按队列满/空时的反应分为三类:

抛出异常的方法

返回值的方法

带超时的变体

offer 和 poll 均支持超时:

boolean success = queue.offer(item, 100, TimeUnit.MILLISECONDS);

此例中,方法尝试插入 item 最多 100 毫秒,超时返回 false。支持的时间单位包括 days、hours、minutes、seconds、milliseconds、microseconds、nanoseconds。

阻塞方法

这些方法是生产者-消费者模式的关键,让线程无需忙等待即可同步。


ArrayBlockingQueue 示例

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
public class Main {
    public static void main(String[] args) {
        // 创建容量为 5 的有界阻塞队列
        BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5);
        try {
            // 插入元素 — 队列满时会阻塞
            numbers.put(2);
            numbers.put(1);
            numbers.put(3);
            System.out.println("BlockingQueue: " + numbers);
            // 移除元素 — 队列空时会阻塞
            int removedNumber = numbers.take();
            System.out.println("移除的数字: " + removedNumber);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.err.println("操作被中断: " + e.getMessage());
        }
    }
}

输出

BlockingQueue: [2, 1, 3]
移除的数字: 2

深入了解请参阅官方文档 ArrayBlockingQueue。


为何使用 BlockingQueue?

BlockingQueue 的核心优势在于其固有的线程安全性。多线程并发生产、消费数据时,无需显式同步。

假设生产者线程插入速度慢于消费者移除速度。若无阻塞行为,消费者可能抛异常或陷入忙等待循环。BlockingQueue 会自动挂起消费者,直到生产者提供新数据,反之亦然。

利用这些内置阻塞机制,开发者能以最少样板代码构建健壮、可扩展的并发应用。


---

java

  1. 精通 Java 运算符:类型、语法与实战示例
  2. Java 注释:类型、用法与最佳实践
  3. 精通 Java if…else:控制流全解析
  4. 精通 Java 增强 for 循环:语法、示例与最佳实践
  5. Java break 语句:用法、时机与标签 break 详解
  6. 精通 Java 字符串:创建、方法与最佳实践
  7. 精通 Java 接口:概念、实现与最佳实践
  8. 精通 Java 匿名内部类:定义、语法与实战示例
  9. 精通 Java Try-With-Resources:自动资源管理详解
  10. Java 注解详解:类型、放置位置与实战示例
  11. Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
  12. 深入理解 Java Vector:用法、特性及与 ArrayList 的对比