博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Basic Of Concurrency(十八: 阻塞队列)
阅读量:6850 次
发布时间:2019-06-26

本文共 1331 字,大约阅读时间需要 4 分钟。

一个队列在队空和队满的情况下进行出队和进队操作会发生阻塞,这种队列我们称之为阻塞队列.队列在队空的情况下进行出队操作会发生阻塞,直到有一到多个队项入队为止.队列在队满的情况下入队会发生阻塞,直到有队项出列或队空的情况下.

这是一个两个线程通过阻塞队列协作的示例图:

我们可以看出一个线程从队列中取出队项,一个线程往队列中放入对项.

Java5的java.util.concurrent包中已有现成的阻塞队列实现.但我们仍然很有必要知道它的底层实现原理.

阻塞队列实现

一个阻塞队列的实现看起来有点像BoundedSemaphore.如下一个简单的阻塞队列实现:

public class BlockingQueue
{ private List
queue = new ArrayList<>(); private int limit = 10; public BlockingQueue(int limit) { this.limit = limit; } public synchronized void enqueue(T item) { while (queue.size() == limit) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } if (queue.size() == 0) { notifyAll(); } queue.add(item); } public synchronized T dequeue(){ while (queue.size() == 0){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } if(queue.size() == limit){ notifyAll(); } return queue.remove(0); }}复制代码

我们可以注意到当调用enqueue()和dequeue()发现队满和队空时需要调用notifyAll()来唤醒相应的线程来取出和放入队项.如果队列大小没有达到限制,那么两个线程可以在不用阻塞线程的情况下放入和取出队项.

该系列博文为笔者复习基础所著译文或理解后的产物,复习原文来自Jakob Jenkov所著

转载于:https://juejin.im/post/5caf57ab5188251aef62146a

你可能感兴趣的文章
Java面试必看二十问题
查看>>
《C语言及程序设计》实践参考——分支嵌套流程图-五等级成绩
查看>>
移动端网络优化
查看>>
测试并发应用(二)监控Phaser类
查看>>
云上游戏数据分析实践
查看>>
前端如何实现数据双向绑定
查看>>
视频码率那些事
查看>>
Android仿网易云音乐:留声机效果
查看>>
vue-cli项目升级webpack4踩坑
查看>>
Python爬虫框架,内置微博、自如、豆瓣图书、拉勾、拼多多等规则
查看>>
android View 的绘制流程
查看>>
怎么实现mybatis半自动化解耦!看看资深程序员怎么说
查看>>
Java根据list中对象的属性找出list重复数据或去除list重复数据
查看>>
一个能拖动,能调整大小,能更新bind值的vue指令-vuedragx
查看>>
一种 redux action 和 reducer 的新写法
查看>>
记一次基于vue-cli的多页面应用配置
查看>>
适用于小程序的 ES6
查看>>
Ribbon使用方法
查看>>
【译】将 Android 项目迁移到 Kotlin 语言
查看>>
vue 项目打包部署,通过nginx 解决跨域问题
查看>>