阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列,下图展示了如何通过阻塞队列来合作:

线程1往阻塞队列中添加元素,而线程2从阻塞队列中移除元素

从5.0开始,JDK在java.util.concurrent包里提供了阻塞队列的官方实现。尽管JDK中已经包含了阻塞队列的官方实现,但是熟悉其背后的原理还是很有帮助的。

阻塞队列的实现

阻塞队列的实现类似于带上限的Semaphore的实现。下面是阻塞队列的一个简单实现

public class BlockingQueue {

private List queue = new LinkedList();

private int limit = 10;

public BlockingQueue(int limit){

this.limit = limit;

}

public synchronized void enqueue(Object item)

throws InterruptedException {

while(this.queue.size() == this.limit) {

wait();

}

if(this.queue.size() == 0) {

notifyAll();

}

this.queue.add(item);

}

public synchronized Object dequeue()

throws InterruptedException{

while(this.queue.size() == 0){

wait();

}

if(this.queue.size() == this.limit){

notifyAll();

}

return this.queue.remove(0);

}

}

必须注意到,在enqueue和dequeue方法内部,只有队列的大小等于上限(limit)或者下限(0)时,才调用notifyAll方法。如果队列的大小既不等于上限,也不等于下限,任何线程调用enqueue或者dequeue方法时,都不会阻塞,都能够正常的往队列中添加或者移除元素。

java 手写阻塞队列_Java阻塞队列的实现相关推荐

  1. 【重难点】【JUC 03】怎么实现一个线程安全的队列、手写模拟实现一个阻塞队列

    [重难点][JUC 03]怎么实现一个线程安全的队列.手写模拟实现一个阻塞队列 文章目录 [重难点][JUC 03]怎么实现一个线程安全的队列.手写模拟实现一个阻塞队列 一.怎么实现一个线程安全的队列 ...

  2. Java手写线程池-第一代(原创)

    个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 Java手写线程池(第一代) ...

  3. java 手写 jvm高性能缓存

    java 手写 jvm高性能缓存,键值对存储,队列存储,存储超时设置 缓存接口 1 package com.ws.commons.cache; 2 3 import java.util.functio ...

  4. Java 手写一个SQL分页

    Java手写一个类似PageHelper的分页SQL 目前分页插件众所周知的莫过于和mybatis完美融合的PageHelper了,简单两行代码就实现了sql分页,配合PageInfo类,将数据总数量 ...

  5. Java 手写签字去除背景 背景透明

    Java 手写签字去除背景 背景透明 /*** 白底照片去除白底 形成透明底图片* @param file 需要去除背景的图片* @param Path 去除背景后保存图片的路径* @return t ...

  6. java 数据队列_Java 数据结构 - 队列

    Java 数据结构 - 队列 我们今天要讲的数据结构是队列,比如 Java 线程池任务就是队列实现的. 1. 什么是队列 和栈一样,队列也是一种操作受限的线性结构.使用队列时,在一端插入元素,而在另一 ...

  7. java手写一个分页的方法_java web手写实现分页功能

    现在很多流行的框架,都可以很快的把分页效果做出来,但是作为一名程序员你必须得知道手写分页的流程: 场景效果: 一.分页的思路 首先我们得知道写分页代码的思路,保持思路清晰,才能行云流水的去写代码,其实 ...

  8. java循环队列_Java 循环队列的实现

    队列概念 队列(Queue)是限定只能在一端插入.另一端删除的线性表.允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear),没有元素的队列称为"空队列". 队列 ...

  9. java手写实现BST

    难易程度:★★★ 重要性:★★★★★ 今日头条的面试中有过要求:手写实现BST import java.util.*;public class MyBSTImpl {// BST中的节点TreeNod ...

最新文章

  1. webpack打包vue反编译_2020年你必须知道的webpack打包优化方法
  2. 提高PHP性能的53个技巧
  3. 期末复习、化学反应工程科目(第三章)
  4. 一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具
  5. Proxy server 緩存 jsp html
  6. SpringBoot 2.0 集成 JavaMail ,实现异步发送邮件
  7. Gym 101246G Revolutionary Roads
  8. VMware 虚拟机下载与安装
  9. 小爱同学指令大全_小爱同学有趣的命令
  10. Kubernetes Pod报错 filed to get sandbox image “k8s.gcr.io/pause:3.6“
  11. 转自于四火的唠叨(工程师的生活)
  12. php ksc歌词,KSC歌词制作、修改
  13. 虚拟创业云|宝妈和大学生兼职和手机网赚兼职的任务平台大全
  14. Mac上的“任务管理器”在哪里?
  15. FreeSwitch接通30s就挂断
  16. 河南科技学院教务管理系统服务器,河南科技学院教务管理系统:http://jwc.hist.edu.cn...
  17. 【周志华机器学习】十二、计算学习
  18. 计算机组成原理ce和we是什么,EL-JY-Ⅱ 计算机组成原理第二套 实验三
  19. 安卓转移到IOS,传输错误问题
  20. Jenkins 从零开始安装部署

热门文章

  1. python sql注入漏洞 ctf_CTF-WEB 一个登录框SQL盲注
  2. [蓝桥杯][2018年第九届真题]迷宫与陷阱(三维数组标记BFS)
  3. O(n)算法得到数组中第k大的数字
  4. Python实现八皇后问题所有实现方式
  5. Complete Tripartite CodeForces - 1228D(三分图染色)
  6. android studio启动停止命令,那些停止Android Studio任务的方法(不断整理中)
  7. thinkphp session mysql_ThinkPHP实现将SESSION存入MYSQL的方法
  8. lisp中怎样调取图形_越玩越聪明的图形思维游戏
  9. mysql5717开发设置怎么调回来_华为手机这几个默认设置,一定要关闭,再也不卡顿...
  10. linux变量转义,关于linux:在Bash变量中转义awk参数