阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。

对于许多线程问题,可以通过使用一个或多个队列以优雅且安全的方式将其形式化。使用队列可以安全地从一个线程向另一个线程传递数据。例如,银行转账程序,转账线程将转账指令对象插入一个队列中,而不是直接访问银行对象。另一个线程从队列中取出指令执行转账。只有该线程可以访问该银行对象的内部。因此就不需要同步了。
当试图向队列添加元素而队列已满,或是想从队列中移出元素而队列为空时,阻塞队列导致线程阻塞。工作者线程可以周期性地将中间结果存储到阻塞队列中。其他的工作者线程移出中间结果并进一步加以修改。队列会自动的平衡负载。在相邻的线程存在快慢的情况下会进行平衡。
Java中的阻塞队列
java.util.concurrent包提供了几种不同形式的阻塞队列,如数组阻塞队列ArrayBlockingQueue、链表阻塞队列LinkedBlockingQueue、优先级阻塞队列PriorityBlockingQueue和延时队列DelayQueue等,下面简单介绍一下这几个阻塞队列:
数组阻塞队列:ArrayBlockingQueue是一个由数组支持的有界阻塞队列,内部维持着一个定长的数据缓冲队列(该队列由数组构成),此队列按照先进先出(FIFO)的原则对元素进行排序,在构造时需要给定容量。ArrayBlockingQueue内部还保存着两个整形变量,分别标识着队列的头部和尾部在数组中的位置。
对于数组阻塞队列,可以选择是否需要公平性,所谓公平访问队列是指阻塞的所有生产者线程或消费者线程,当队列可用时,可以按照阻塞的先后顺序访问队列,即先阻塞的生产者线程,可以先往队列里插入元素,先阻塞的消费者线程,可以先从队列里获取元素。通常,公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用它。
“我们相信人人都可以成为一个IT大神,现在开始,选择一条阳光大道,助你入门,学习的路上不再迷茫。这里是北京尚学堂,初学者转行到IT行业的聚集地。"

java 队列_百战程序员:Java并发阻塞队列相关推荐

  1. java项目_好程序员Java分享从入门到服务端项目开发的过程

    好程序员Java分享从入门到服务端项目开发的过程,对于打算入门或者刚刚入门学习Java的人来说,刚开始接触这门学科,往往会觉得不知所措,也会觉得很迷茫.结合前人经验,就从入门到进阶对于Java的学习而 ...

  2. javaweb模板_好程序员Java教程分享javaweb框架

    好程序员Java教程分享javaweb框架:Java是开源的,框架很多,这些框架都能解决特定的问题,提高开发效率.简化我们的代码复杂度,现在除了很多大家通用的一些主流框架外,很多公司针对自己的业务会自 ...

  3. hibernate savealiasentity 保存后id为空_好程序员Java教程分享Java面试题之Hibernate

    好程序员Java教程分享Java面试题之Hibernate 1.简书一下Hibernated的开发流程 第一步:加载Hibernate的配置文件,读取配置文件的参数, 第二步:创建SessionFac ...

  4. java web swing 教程_好程序员Java教程解读什么是swing

    原标题:好程序员Java教程解读什么是swing 好程序员Java教程解读什么是swing,swing是java GUI应用程序,也就是java做的桌面应用.运行swing程序要求用户电脑上有java ...

  5. app嵌入jsp页面的项目工作量_好程序员Java学习路线分享jsp为什么用的不多了

    好程序员Java学习路线分享jsp为什么用的不多了,曾经JavaEE开发前端多数用的是JSP技术,因为在JSP出现之前,程序员基本都是在Servlet端直接通过out.print的方式拼接出一个页面返 ...

  6. java static关键字_好程序员Java教程分享static关键字的理解

    好程序员Java教程分享static关键字的理解,static关键字含义可以理解为静态的. 1. 当其修饰属性时,该属性为整个类公有,所有的对象操作的都是同一个静态属性.所以调用时应该使用类名去调用, ...

  7. ajax不执行_好程序员Java学习路线分享原生Ajax的使用

    好程序员Java学习路线分享原生Ajax的使用,首先我们先来看一下什么是 AJAX AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX 就是 异步.JavaScript ...

  8. java获取mysql执行计划_好程序员Java学习路线之MySQL的执行计划

    好程序员 Java 学习路线之 MySQL 的执行计划.什么是执行计划? 执行计划通常是开发者优化 SQL 语句的第一步. MySQL 在解析 SQL 语句时,会生成多套执行方案,然后内部会进行一个成 ...

  9. java喷泉编码_好程序员Java教程分享使用JS实现简单喷泉效果

    原标题:好程序员Java教程分享使用JS实现简单喷泉效果 好程序员Java教程分享使用JS实现简单喷泉效果,最近,在教学生使用JS的基本操作,为了练习JS的基本作用,特地写了一个喷泉效果,代码如下: ...

最新文章

  1. AIX5.3安装bash shell
  2. Source Insight 经典教程
  3. Asp.net Mvc Enum 扩展
  4. [NOI2007]货币兑换Cash(DP+动态凸包)
  5. 一道经典的SQL面试题
  6. 使用PHP发送邮件的两种方法
  7. python干货_python 基础干货 02
  8. MVC实现实现文件流打包成压缩包
  9. 论坛用的两个函数:积分计算排名和楼层函数
  10. 【NLP】Stanford
  11. 做图表统计你需要掌握SQL Server 行转列和列转行
  12. C# 5.0 Async函数的提示和技巧
  13. Lightroom Classic 教程,如何结合使用Photoshop 和 Lightroom?
  14. 批判性思维_通过批判性反思评估可视化创作系统
  15. 状态反馈不改变系统传递函数零点的证明
  16. 翻译pdf中的英文 python_看不懂pdf中的英文?就用Python
  17. java f1_JAVA编码(19)——java使用f1j9swing来生成excel文件
  18. 浅谈jodaTime 的使用
  19. [信息论与编码]离散信源及其信息测度(2)
  20. php json数据值,php操作JSON格式数据

热门文章

  1. 上传文件和提交textfield_0基础掌握Django框架(37)文件上传
  2. 5G大幕已启 将如何改变社会?
  3. 问答丨按量子力学来说,一个人撞墙,有多大概率能穿过去?
  4. 数学如何杀死了雷曼兄弟
  5. dubbo启动服务启动报错.UnsatisfiedDependencyException: Error creating bean with name '***': Un
  6. lucene大牛博客汇总保存
  7. socket网络编程多线程
  8. 云原生时代的运维体系进化
  9. 如何做规划?分享2种思维和4个方法
  10. 蚂蚁架构师郭援非:分布式数据库是金融机构数字化转型的最佳路径