java 中 阻塞队列BlockingQueue详解及实例
发布时间 - 2026-01-11 00:27:44 点击率:次java 中 阻塞队列BlockingQueue详解及实例

BlockingQueue很好的解决了多线程中数据的传输,首先BlockingQueue是一个接口,它大致有四个实现类,这是一个很特殊的队列,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作。
BlockingQueue的四个实现类:
1.ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的.
2.LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的
3.PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序.
4.SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的.
BlockingQueue的常用方法:
1)add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则报异常
2)offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.
3)put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续.
4)poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null
5)take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止
例子:
这个例子主要模拟了生产者和消费者之间的工作流程,是一个简单的消费者等待生产者生产产品供消费者消费的场景。
生产者:
package com.gefufeng;
import java.util.concurrent.BlockingQueue;
public class Producter implements Runnable{
private BlockingQueue<String> blockingQueue;
public Producter(BlockingQueue<String> blockingQueue){
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
try {
blockingQueue.put("我生产的" + Thread.currentThread().getName());
System.out.println("我生产的" + Thread.currentThread().getName());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("生产失败");
}
}
}
消费者:
package com.gefufeng;
import java.util.concurrent.BlockingQueue;
public class Customer implements Runnable{
private BlockingQueue<String> blockingQueue;
public Customer(BlockingQueue<String> blockingQueue){
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
for(;;){
try {
String threadName = blockingQueue.take();
System.out.println("取出:" + threadName);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("取出失败");
}
}
}
}
执行类:
package com.gefufeng;
import java.util.concurrent.ArrayBlockingQueue;
public class Executer {
public static void main(String[] args) {
ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<String>(2);
Producter producter = new Producter(arrayBlockingQueue);
Customer cusotmer = new Customer(arrayBlockingQueue);
new Thread(cusotmer).start();
for(;;){
try {
Thread.sleep(2000);
new Thread(producter).start();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
首先是消费者循环等待产品,当第一次循环时执行blockingQueue.take(),是拿不出任何产品的,于是进入阻塞状态,两秒后,生产者生产了一个产品,于是blockingQueue拿到产品,打印了日志,然后消费者执行第二次循环,发现blockingQueue.take()又没拿到产品,于是又进入阻塞状态。。。依次循环
感谢阅读,希望能帮助到大家,谢谢大家,对本站的支持!
# java
# 阻塞队列BlockingQueue
# 中
# 阻塞队列BlockingQueue实例详解
# 详解Java阻塞队列(BlockingQueue)的实现原理
# Java源码解析阻塞队列ArrayBlockingQueue常用方法
# Java并发编程之阻塞队列详解
# Java中使用阻塞队列控制线程集实例
# 关于Java中阻塞队列BlockingQueue的详解
# java阻塞队列实现原理及实例解析
# 深入理解Java线程编程中的阻塞队列容器
# Java 阻塞队列的7种类型小结
# 是一个
# 所含
# 才会
# 排在
# 首位
# 若不
# 取走
# 先入
# 很好
# 也会
# 将会
# 进了
# 这是一个
# 对其
# 希望能
# 或者是
# 谢谢大家
# 则可
# 但其
# 类似于
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
晋江文学城电脑版官网 晋江文学城网页版直接进入
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
图册素材网站设计制作软件,图册的导出方式有几种?
网站图片在线制作软件,怎么在图片上做链接?
微信公众帐号开发教程之图文消息全攻略
如何在阿里云ECS服务器部署织梦CMS网站?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
zabbix利用python脚本发送报警邮件的方法
中国移动官方网站首页入口 中国移动官网网页登录
网站制作壁纸教程视频,电脑壁纸网站?
高性价比服务器租赁——企业级配置与24小时运维服务
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
Android okhttputils现在进度显示实例代码
Laravel怎么上传文件_Laravel图片上传及存储配置
Laravel如何使用.env文件管理环境变量?(最佳实践)
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
如何在Ubuntu系统下快速搭建WordPress个人网站?
三星网站视频制作教程下载,三星w23网页如何全屏?
JS碰撞运动实现方法详解
如何快速启动建站代理加盟业务?
长沙企业网站制作哪家好,长沙水业集团官方网站?
网页设计与网站制作内容,怎样注册网站?
jQuery validate插件功能与用法详解
Android自定义listview布局实现上拉加载下拉刷新功能
EditPlus中的正则表达式 实战(2)
简单实现Android验证码
北京企业网站设计制作公司,北京铁路集团官方网站?
重庆市网站制作公司,重庆招聘网站哪个好?
javascript日期怎么处理_如何格式化输出
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
Laravel如何使用withoutEvents方法临时禁用模型事件
高防服务器租用如何选择配置与防御等级?
Python文件流缓冲机制_IO性能解析【教程】
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
做企业网站制作流程,企业网站制作基本流程有哪些?
如何在IIS中新建站点并配置端口与IP地址?
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
使用豆包 AI 辅助进行简单网页 HTML 结构设计
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
MySQL查询结果复制到新表的方法(更新、插入)
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】

