LinkedBlockQueue生产消费源码解析
LinkedBlockQueue自JDK1.5以后提供的一种阻塞队列,遵循生产者消费者模式,实现了BlockQueue接口,如图
从它的名字可以了解到它是采用链表的方式实现了阻塞队列,并且定义了“节点”的内部类,如图
我们看到,每个Node当中除了Node的数据item以外只有一个next节点来指向下一个节点。
另外LinkedBlockQueue在实现里采用了ReentrantLock来控制生产和消费等操作的并发情况,并且采用关联的Condition来做阻塞等待,所以它是线程安全的。
DEMO
接下来,我们把LinkedBlockQueue的DEMO作为入口,代码如下
构造方法
构造方法允许指定队列最大容量,如果不指定则采用INT的最大值。所以LinkedBlockQueue实际上也属于有界队列,只是它的默认队列容量很大,一般情况下不会出现超过容量的情况。
LinkedBlockQueue定义了head和last节点分别表示起始和结束,是一种双端链表的实现方式,head的item永远为null,last的next永远为null,当队列为空的时候head节点和last节点指向一个空的Node
生产操作offer(E e)
offer(E e)方法仅提供一个数据入参,如果容量未满则入队,如果满了那么直接结束。
入队方法很简单,就是将当前最后一个节点的next指向新的节点,并且新的节点成为最后一个节点
生产操作offer(E e, long timeout, TimeUnit unit)
该方法与普通offer方法的区别在于提供了超时时间,也就是说在没有空间可以增加元素的时候会进行阻塞等待,这里采用Condition的方式实现
生产操作put(E e)
put方法跟offer的区别在于,如果没有足够的空间put会一直等待直到中断或者有空间
消费操作poll()
poll操作不会进行等待,如果没有待消费的元素,那么直接返回
出队操作就是把当前的第一个head节点的next指向自己,真正的第一个node节点成为head节点
消费操作poll(long timeout, TimeUnit unit)
如果没有待消费的数据,该方法会进行等待,直到有消费数据或者中断
消费操作take()
跟put类似take是一个会一直等待的操作,如果没有待消费的数据那么就阻塞直到中断或者消费到数据
LinkedBlockQueue在的生产和消费操作是通过互斥锁来控制并发的,也就是同时只会有一个生产操作或者一个消费操作,当生产操作完成会通知等待消费线程,消费操作完成会通知等待生产的线程。
LinkedBlockQueue生产消费源码解析的更多相关文章
- [源码解析] 并行分布式任务队列 Celery 之 消费动态流程
[源码解析] 并行分布式任务队列 Celery 之 消费动态流程 目录 [源码解析] 并行分布式任务队列 Celery 之 消费动态流程 0x00 摘要 0x01 来由 0x02 逻辑 in komb ...
- 时序数据库 Apache-IoTDB 源码解析之系统架构(二)
上一章聊到时序数据是什么样,物联网行业中的时序数据的特点:存量数据大.新增数据多(采集频率高.设备量多).详情请见: 时序数据库 Apache-IoTDB 源码解析之前言(一) 打一波广告,欢迎大家访 ...
- Java并发包源码学习系列:阻塞队列实现之ArrayBlockingQueue源码解析
目录 ArrayBlockingQueue概述 类图结构及重要字段 构造器 出队和入队操作 入队enqueue 出队dequeue 阻塞式操作 E take() 阻塞式获取 void put(E e) ...
- Java并发包源码学习系列:阻塞队列实现之SynchronousQueue源码解析
目录 SynchronousQueue概述 使用案例 类图结构 put与take方法 void put(E e) E take() Transfer 公平模式TransferQueue QNode t ...
- Java并发包源码学习系列:阻塞队列实现之LinkedTransferQueue源码解析
目录 LinkedTransferQueue概述 TransferQueue 类图结构及重要字段 Node节点 前置:xfer方法的定义 队列操作三大类 插入元素put.add.offer 获取元素t ...
- [源码解析] 消息队列 Kombu 之 基本架构
[源码解析] 消息队列 Kombu 之 基本架构 目录 [源码解析] 消息队列 Kombu 之 基本架构 0x00 摘要 0x01 AMQP 1.1 基本概念 1.2 工作过程 0x02 Poll系列 ...
- [源码解析] 并行分布式框架 Celery 之架构 (1)
[源码解析] 并行分布式框架 Celery 之架构 (1) 目录 [源码解析] 并行分布式框架 Celery 之架构 (1) 0x00 摘要 0x01 Celery 简介 1.1 什么是 Celery ...
- [源码解析] 并行分布式任务队列 Celery 之 EventDispatcher & Event 组件
[源码解析] 并行分布式任务队列 Celery 之 EventDispatcher & Event 组件 目录 [源码解析] 并行分布式任务队列 Celery 之 EventDispatche ...
- [源码解析] 深度学习分布式训练框架 horovod (19) --- kubeflow MPI-operator
[源码解析] 深度学习分布式训练框架 horovod (19) --- kubeflow MPI-operator 目录 [源码解析] 深度学习分布式训练框架 horovod (19) --- kub ...
随机推荐
- 【VB.NET】利用纯真IP数据库查询IP地址及信息
几年前从某个博客抄来的,已经忘记原地址了,如果需要C#版的,可以在博客园搜到吧.我因为自己用,所以转换为了VBNET代码,而且也放置了很久,今天无意间翻出来,就分享给大家吧. 首先,先下载 纯真数据库 ...
- 数据导出之winfrom导出word(一)
我们常会用winfrom程序开发小工具,使用dataGridView控件展示数据.同时,我们也会有将这些数据导出的需求. 本篇文章介绍了开发过程中遇到的问题. 一.引用组件 首先,需要在窗体程序中引用 ...
- Python3.5 学习二十四
本节课程大纲: -------------------------------------------------------------------------------------------- ...
- http://www.vaikan.com/docs/jquery.form.plugin/jquery.form.plugin.html#getting-started
http://www.vaikan.com/docs/jquery.form.plugin/jquery.form.plugin.html#getting-started Jquery.Form 异步 ...
- Upgrade Win10
Internal deployment of Windows 10 Enterprise is currently underway as a phased deployment. Watch you ...
- Windows Phone开发手记-WinRT下分组拼音的实现
Windows Phone版本号自升入8.1以来,开发者就多了一个选项,开发基于WinRT架构的WP或者Universal Windows App.然而开发框架转为WinRT后,很多原有的WP8基于S ...
- linux下hex转ascii
场景: 在wireshark里面提取response包的值. echo -n "1f8b08000000000000030cd335b2e580014" | xxd -r -p & ...
- flask框架~简易编写
flaks框架: 先导报 from flask import Flask 重定向模块:redirect url_for是简易寻址跳转 jsonify强转为json格式 建立flask对象:app = ...
- golang 并发顺序输出数字
参考 package main import ( "fmt" "sync/atomic" "time" ) func main() { va ...
- opencv2.4.13.7的resize函数使用(c++)
先来看一下resize函数的原型,如下. C++: void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, doub ...