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中访问类常量与静态属性的优势【解答】