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

精通 Java LinkedBlockingQueue:全面指南与实战示例

Java LinkedBlockingQueue

探索 LinkedBlockingQueue 类、其核心方法及实战示例,解锁 Java 中的线程安全队列。

LinkedBlockingQueue 类位于 Java java.util.concurrent 包,实现基于链表的阻塞队列。它遵循 BlockingQueue 接口,为并发生产者-消费者场景提供健壮、线程安全的结构。

精通 Java LinkedBlockingQueue:全面指南与实战示例


创建 LinkedBlockingQueue

使用前导入 java.util.concurrent.LinkedBlockingQueue:

import java.util.concurrent.LinkedBlockingQueue;

1. 不指定初始容量

LinkedBlockingQueue<Type> queue = new LinkedBlockingQueue<>();

默认容量为 Integer.MAX_VALUE (231–1),实际上无界。

2. 指定容量

LinkedBlockingQueue<Type> queue = new LinkedBlockingQueue<>(int capacity);

示例:

// 容量 5 的 String 队列
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
// 容量 5 的 Integer 队列
LinkedBlockingQueue<Integer> ages = new LinkedBlockingQueue<>(5);

注意: 容量可选;省略则创建无界队列。


LinkedBlockingQueue 的关键方法

该类实现所有 BlockingQueue 方法,支持插入、获取、移除元素。其中 put() 和 take() 提供阻塞行为,区别于普通队列。

插入元素

示例:

import java.util.concurrent.LinkedBlockingQueue;
public class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        animals.add("Dog");
        animals.add("Cat");
        animals.offer("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);
    }
}

输出

LinkedBlockingQueue: [Dog, Cat, Horse]

访问元素

示例:

import java.util.concurrent.LinkedBlockingQueue;
import java.util.Iterator;
public class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);
        String head = animals.peek();
        System.out.println("访问的元素: " + head);
        Iterator<String> it = animals.iterator();
        System.out.print("LinkedBlockingQueue 元素: ");
        while (it.hasNext()) {
            System.out.print(it.next() + ", ");
        }
    }
}

输出

LinkedBlockingQueue: [Dog, Cat, Horse]
访问的元素: Dog
LinkedBlockingQueue 元素: Dog, Cat, Horse, 

移除元素

示例:

import java.util.concurrent.LinkedBlockingQueue;
public class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);
        String removed = animals.remove();
        System.out.println("remove(): " + removed);
        String polled = animals.poll();
        System.out.println("poll(): " + polled);
        animals.clear();
        System.out.println("更新后的 LinkedBlockingQueue: " + animals);
    }
}

输出

LinkedBlockingQueue: [Dog, Cat, Horse]
remove(): Dog
poll(): Cat
更新后的 LinkedBlockingQueue: []

阻塞操作:put() 与 take()

在并发场景下,put() 和 take() 阻塞调用线程直到操作可进行,安全协调生产者与消费者。

put()

在尾部插入元素,队列满时等待。

示例:

import java.util.concurrent.LinkedBlockingQueue;
public class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        try {
            animals.put("Dog");
            animals.put("Cat");
            System.out.println("LinkedBlockingQueue: " + animals);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.err.println(e.getMessage());
        }
    }
}

输出

LinkedBlockingQueue: [Dog, Cat]

take()

获取并移除队头元素,队列空时阻塞。

示例:

import java.util.concurrent.LinkedBlockingQueue;
public class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        try {
            animals.put("Dog");
            animals.put("Cat");
            System.out.println("LinkedBlockingQueue: " + animals);
            String removed = animals.take();
            System.out.println("移除的元素: " + removed);
            System.out.println("新 LinkedBlockingQueue: " + animals);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.err.println(e.getMessage());
        }
    }
}

输出

LinkedBlockingQueue: [Dog, Cat]
移除的元素: Dog
新 LinkedBlockingQueue: [Cat]

其他实用方法

方法说明
contains(Object o)判断队列是否包含指定元素
size()返回当前元素数量
toArray()转换为数组
toString()队列的字符串表示

为何选择 LinkedBlockingQueue?

因其内部使用链表,LinkedBlockingQueue 提供:

在多线程应用中,若生产者比消费者慢,队列会自动挂起消费者直到新项到达,防止忙等待并降低 CPU 开销。

对于高性能并发工作负载,Java 并发 API 推荐 LinkedBlockingQueue 作为生产者-消费者管道的首选结构。

---

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 的对比