
Java常用阻塞队列及其实现原理详解
下载需积分: 19 | 21KB |
更新于2025-04-27
| 131 浏览量 | 举报
收藏
在Java编程语言中,阻塞队列是Java并发包(java.util.concurrent)中一种特殊的线程安全的队列。阻塞队列通过使用内部锁或者内置的条件变量来协调生产者和消费者之间的同步问题。当队列满时,生产者线程会被阻塞,直到有空间可用;当队列空时,消费者线程会被阻塞,直到有可用元素。本文将详细介绍在Java中常用的阻塞队列,并给出相关的Demo代码示例。
### ArrayBlockingQueue
`ArrayBlockingQueue` 是一个基于数组结构的有界阻塞队列。此队列按照先进先出(FIFO)的原则对元素进行排序。一旦创建了这样的队列,就不能再修改容量了,也就是说队列的容量是固定的。当队列满了,尝试入队的线程将会被阻塞;当队列空了,尝试出队的线程将会被阻塞,直到队列中有新的元素。
#### 关键知识点:
- **容量限制**:必须在创建时指定大小,之后无法改变。
- **线程安全**:通过内置的锁机制保证了多线程环境下的线程安全。
- **阻塞操作**:入队(put)、出队(take)操作会阻塞调用的线程。
### LinkedBlockingQueue
`LinkedBlockingQueue` 是一个基于链表结构的阻塞队列。它可以选择性地指定初始容量,如果不指定,则默认为`Integer.MAX_VALUE`,近似无界。它同样支持FIFO的元素排列方式。该队列的操作是通过分离锁实现的,入队和出队操作分别由不同的锁来保护,这样可以提高并发性,但也可能导致更高的争用。
#### 关键知识点:
- **容量可选**:可以指定队列大小,也可以不指定,后者近乎无界。
- **链表结构**:元素以链表的方式组织,内存使用比`ArrayBlockingQueue`灵活。
- **分离锁机制**:提高了并发性能,但可能导致更多的锁争用。
### PriorityBlockingQueue
`PriorityBlockingQueue` 是一个支持优先级的无界阻塞队列。它不保证FIFO顺序,而是根据元素的自然顺序或者通过构造函数提供的`Comparator`来排序。由于队列是无界的,因此不需要考虑队列满的情况,但是当队列为空时,尝试出队的线程仍然会被阻塞。
#### 关键知识点:
- **无界队列**:容量可以无限扩展,不会因为队列满而阻塞入队线程。
- **元素排序**:根据自然顺序或Comparator进行排序。
- **优先级队列**:出队的元素总是队列中优先级最高的元素。
### 示例代码(Demo)
以下是一个简单的示例,演示了如何使用上述三种阻塞队列。
```java
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.Comparator;
import java.util.PriorityQueue;
public class BlockingQueueDemo {
// ArrayBlockingQueue 示例
public static void arrayBlockingQueueExample() throws InterruptedException {
BlockingQueue<Integer> arrayQueue = new ArrayBlockingQueue<>(3);
arrayQueue.put(1);
arrayQueue.put(2);
arrayQueue.put(3);
// arrayQueue.put(4); // 这将会抛出 InterruptedException 因为队列已满
System.out.println(arrayQueue.take());
System.out.println(arrayQueue.take());
System.out.println(arrayQueue.take());
// System.out.println(arrayQueue.take()); // 这将会阻塞,因为队列为空
}
// LinkedBlockingQueue 示例
public static void linkedBlockingQueueExample() throws InterruptedException {
BlockingQueue<Integer> linkedQueue = new LinkedBlockingQueue<>(3);
linkedQueue.put(1);
linkedQueue.put(2);
linkedQueue.put(3);
// linkedQueue.put(4); // 这将不会阻塞,因为队列近乎无界
System.out.println(linkedQueue.take());
System.out.println(linkedQueue.take());
System.out.println(linkedQueue.take());
// System.out.println(linkedQueue.take()); // 这将会阻塞,因为队列为空
}
// PriorityBlockingQueue 示例
public static void priorityBlockingQueueExample() throws InterruptedException {
BlockingQueue<Integer> priorityQueue = new PriorityBlockingQueue<>();
priorityQueue.put(1);
priorityQueue.put(5);
priorityQueue.put(3);
System.out.println("Head element: " + priorityQueue.take()); // 输出优先级最高的元素,这里是1
System.out.println("Head element: " + priorityQueue.take()); // 输出优先级最高的元素,这里是3
System.out.println("Head element: " + priorityQueue.take()); // 输出优先级最高的元素,这里是5
}
public static void main(String[] args) throws InterruptedException {
arrayBlockingQueueExample();
linkedBlockingQueueExample();
priorityBlockingQueueExample();
}
}
```
以上代码示例中,我们创建了三种不同类型的阻塞队列,并对它们的基本操作进行了演示。注意在生产环境中,应该使用合适的异常处理来处理阻塞队列操作可能抛出的异常。此外,根据具体需求选择合适的阻塞队列类型至关重要。
### 结语
在多线程编程中,阻塞队列提供了一种优雅的方式来处理生产者和消费者之间的协调工作。通过合理地应用阻塞队列,能够帮助我们解决复杂的同步问题,并提高程序的可读性和稳定性。了解并掌握`ArrayBlockingQueue`、`LinkedBlockingQueue`以及`PriorityBlockingQueue`这些常用的阻塞队列类型,对于提升Java并发编程能力是必不可少的。
相关推荐




















Demons丶丶
- 粉丝: 40
最新资源
- Python脚本快速生成SSH ECDSA 521位密钥
- 2021年信息技术实习培训:新实习生的入门与目标设定
- Sonic RPG Eps 9-crx插件体验:终极刺猬冒险游戏
- 构建基于Jekyll和Bootstrap的博客模板
- 实时天气预报(RTWeather)插件 - 提供即时温度与未来天气
- 网易云音乐风格的Android开源项目CloudReader
- Haiyajan菜单UI工具包:跨平台C99与SDL2应用
- 每天一块好消息:Goodnews Chrome扩展
- Vechain价格监控与回纸扩展插件使用指南
- contactlog:基于MERN堆栈的联系人管理系统开发
- 定制新闻体验:Billion Dollar Loser-crx插件介绍
- Yambo代码v5.0.1的GCC v9.3与MKL集成Docker容器指南
- Firas Esbai的GitHub博客:HTML技术分享
- 个人数据分析投资组合的GitHub Pages实践指南
- 宏观经济视角下的Laravel框架详解
- 打造定制化ViewPager指示效果的强大框架
- Pixel Battle Royale: 探索CRX扩展程序的游戏世界
- astroBF软件包:神经色调映射器提升星系图像质量
- 如何在Docker中配置并获取开发环境文件
- 提高浏览效率:Meh.com论坛未读内容快速滚动插件
- bangin: 实现DuckDuckGo式刘海的可移植shell脚本
- ECSHOP淘宝评论与商品采集插件功能解析
- 印度今日金价查询-crx插件
- 实时查看美元和印度卢比最新白银黄金价格-crx插件