BlockingQueue的基本原理
来源:互联网 发布:贵金属网络销售怎么样 编辑:程序博客网 时间:2024/06/09 20:03
BlockingQueue即阻塞队列,它算是一种将ReentrantLock用得非常精彩的一种表现,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所示:
在Java中,BlockingQueue是一个接口,它的实现类有ArrayBlockingQueue、DelayQueue、 LinkedBlockingDeque、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,它们的区别主要体现在存储结构上或对元素操作上的不同,但是对于take与put操作的原理,却是
类似的。下面的源码以ArrayBlockingQueue为例。
2. 分析
BlockingQueue内部有一个ReentrantLock,其生成了两个Condition,在ArrayBlockingQueue的属性声明中可以看见:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
而如果能把notEmpty、notFull、put线程、take线程拟人的话,那么我想put与take操作可能会是下面这种流程:
put(e)
take()
其中ArrayBlockingQueue.put(E e)源码如下(其中中文注释为自定义注释,下同):
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
ArrayBlockingQueue.take()源码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
可以看见,put(E)与take()是同步的,在put操作中,当队列满了,会阻塞put操作,直到队列中有空闲的位置。而在take操作中,当队列为空时,会阻塞take操作,直到队列中有新的元素。
而这里使用两个Condition,则可以避免调用signal()时,会唤醒相同的put或take操作。
- BlockingQueue的基本原理
- BlockingQueue的基本原理
- 【图解JDK源码】BlockingQueue的基本原理
- 线程BlockingQueue的使用
- c++ 实现的BlockingQueue
- BlockingQueue的使用
- BlockingQueue的使用
- 线程安全的BlockingQueue
- BlockingQueue的使用
- BlockingQueue的使用
- BlockingQueue的使用
- BlockingQueue的使用
- BlockingQueue的使用
- BlockingQueue的核心方法
- 0014-BlockingQueue的用法
- BlockingQueue的使用
- BlockingQueue的使用
- BlockingQueue的使用
- 表单基础
- 框架的创建
- SIM900A与网络调试助手进行TCP收发通信
- Android Studio 创建窗口默认继承Activity而非AppCompatActivity
- 删除下拉列表中的选项
- BlockingQueue的基本原理
- 第三方免费加固横向对比
- 嵌入式开发 迅为i.MX6Q开发板启动流程内容分享
- QT 实现播放器中音量控制
- select对象和option对象联合应用
- 最新wingide6破解方法(支持Linux),亲测有效,支持python3.0
- 自定义鼠标提示
- 正则表达式深入理解
- 创建层DIV