1.基于wait和notify方法实现的阻塞队列

public class WaitNotifyInterview {public final static int QUEUE_SIZE = 10;public static PriorityQueue<Integer> queue = new PriorityQueue<>();public static void main(String[] args) {new Thread(() -> {while (true) {synchronized (WaitNotifyInterview.queue) {while (WaitNotifyInterview.queue.size() < WaitNotifyInterview.QUEUE_SIZE) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}WaitNotifyInterview.queue.offer(1);System.out.println("生产了一个商品,商品数量:" + WaitNotifyInterview.queue.size());WaitNotifyInterview.queue.notify();}System.out.println("生产放不下了,赶紧来消费" + WaitNotifyInterview.queue.size());try {WaitNotifyInterview.queue.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}).start();new Thread(() -> {while (true) {synchronized (WaitNotifyInterview.queue) {while (WaitNotifyInterview.queue.size() == 0) {System.out.println("没有商品了,赶快生产一个。商品数量:" + WaitNotifyInterview.queue.size());try {WaitNotifyInterview.queue.wait();} catch (InterruptedException e) {e.printStackTrace();}}try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}WaitNotifyInterview.queue.poll();System.out.println("消费了一个商品,商品剩余:" + WaitNotifyInterview.queue.size());WaitNotifyInterview.queue.notify();}}}).start();}
}

2.使用ArrayBlockingQueue(底层还是第三种方法的实现原理)实现阻塞队列(此方法线程的等待是在源码中执行的所有我们在外面打印生产消费,会很混乱)

public class BlockingQueueInterview {//定义一个队列并声明队列长度public static final Integer QUEUE_SIZE = 10;public static ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(QUEUE_SIZE);public static void main(String[] args) {Perduct1 perduct1 = new Perduct1();consumer1 consumer1 = new consumer1();new Thread(perduct1).start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}new Thread(consumer1).start();}}
//定义一个生产者
class Perduct1 implements Runnable{@Overridepublic void run() {while (true) {try {BlockingQueueInterview.queue.put(1);} catch (InterruptedException e) {e.printStackTrace();}}}
}//定义一个消费者
class consumer1 implements Runnable{@Overridepublic void run() {while (true) {try {BlockingQueueInterview.queue.take();} catch (InterruptedException e) {e.printStackTrace();}}}
}

3.使用ReentrantLock和condition实现阻塞队列

public class CountDownLatchInterview {//创建可重入锁对象static ReentrantLock reentrantLock = new ReentrantLock();//从可重入锁对象中,取得线程间通信对象static Condition condition = reentrantLock.newCondition();//定义一个中间变量来存放值static int a = 0;public static void main(String[] args) {CountDownLatchInterview countDownLatchInterview = new CountDownLatchInterview();new Thread(() -> {while (true){reentrantLock.lock();try {while (a == 10) {System.out.println("仓库已经放不下了");condition.await();}System.out.println("生产了一个商品,现在商品总数:" + (++a));condition.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {reentrantLock.unlock();}}}).start();new Thread(() -> {while (true){reentrantLock.lock();try {while (a == 0) {System.out.println("仓库没有了");condition.await();}System.out.println("消费一个商品,现在商品总数:" + (--a));condition.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {reentrantLock.unlock();}}}).start();}
}

三种方式实现阻塞队列(简单版)相关推荐

  1. 微服务中数据聚合的三种方式

    在微服务暴热的情形下,似乎不弄点微服务,已经是跟不上IT的大潮了. 因此,公司结合本身情况,以及将来的可拓展性,在我的主导下,在新的项目中采用了微服务架构 然而,实施过程中遇到一个挠头的问题,就是数据 ...

  2. python定时执行脚本_Python实现定时执行任务的三种方式简单示例

    本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 #!/user/bin/env python # @Time :2018/6/7 16:31 ...

  3. python实现定时任务的方式_Python实现定时执行任务的三种方式简单示例

    本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 #!/user/bin/env python # @Time :2018/6/7 16:31 ...

  4. php简单记账本_代理记账的三种方式

    代理记账是指将本企业的会计核算.记账.报税等一系列的会计工作全部委托给专业记账公司完成,本企业只设立出纳人员,负责日常货币收支业务和财产保管等工作.一般来说 代理记账 业务主要分为三个方面分别是专项代 ...

  5. Tomcat映射虚拟目录的三种方式(2021版)

    前言:首先要弄明白什么是TOMCAT的虚拟目录:当WEB应用开发完毕后,如果想要对外发布就需要部署到服务器上面,服务器的主要功能就是需要监听端口.接收和解析访问请求并转发给相应的WEB应用进行处理.比 ...

  6. python手机版怎么运行项目或脚本-详解python运行三种方式

    方式一 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下: $ p ...

  7. 简单了解计算机网络中数据传输的三种方式

    简单理解数据传输:计算机之间实现远程文件和多媒体信息获取和发送的行为. 准确理解数据传输:按照一定的规程,通过一条或者多条数据链路,将数据从数据源传输到数据终端,它的主要作用就是实现点与点之间的信息传 ...

  8. access下如何配置两个vlan_不同vlan间的通信如何简单配置(三种方式) ?

    1.单臂路由(图) 环境:一台路由器,一台二层交换机,两台pc机 二层交换机的配置 一般模式: Switch> 输入enable进入特权模式: Switch>enable 输入config ...

  9. 简单介绍apache虚拟主机配置的三种方式

    本文主要介绍了apache虚拟主机配置的三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 记事本打开httpd.conf文 ...

最新文章

  1. 从语言学到深度学习NLP,一文概述自然语言处理
  2. asyncdata连接php,如何使用Nuxt和asyncData观察路由更改
  3. halcon read_ocr_trainf 从文件中读取训练字符并转换为图像
  4. day20 java的String
  5. 将Maven集成到IDEA
  6. 【操作系统】—进程同步和进程互斥
  7. java 查找引用_java – Eclipse查找方法的引用
  8. 十五部必藏之经典日剧(给喜欢怀旧的朋友)--转贴,的确经典,还有很多没看过,不过排名前二都看了,呵呵...
  9. 赋能泉城 2017中国软件生态大会再下一城
  10. 2020年十大数字客户体验(CX)软件平台
  11. 159 samba 无法访问。您可能没有权限使用网络资源 net use命令
  12. Amy-Tabb机器人世界手眼标定(1、环境搭配)
  13. 又要数数小绵羊(C++) kkmd66
  14. 广州计算机行业目前发展趋势,2019年中国广东电子制造业产业发展概况及发展趋势分析[图]...
  15. mysql的时区设置
  16. 上海大学计算机学院卞韬,我校计算机工程与科学学院学生在CCPC中国大学生程序设计竞赛中喜获金奖...
  17. 在Docker中运行EOS(MAC版)
  18. backports/lzma/_lzmamodule.c:115:18: fatal error: lzma.h: No such file or directory serWarning: Coul
  19. R/RStudio 常用函数
  20. convs在MATLAB中,vscon美瞳

热门文章

  1. 爱了爱了!骚红色机械键盘写代码真香,包邮送!
  2. 修改wifi密码 及168.192.1.1登录
  3. 2016天天飞车服务器维护,腾讯天天飞车即将停服,大批老玩家集体上线,这是最后一次飞车了...
  4. Springboot项目使用jasypt加密配置文件中的敏感信息
  5. 全面进军国际市场?酷派的手机“野心”拿什么来实现
  6. OSChina 周六乱弹 —— 防止被讹的正确方法
  7. JavaScript事件 鼠标事件
  8. OpenGL使用纯VBO方式渲染出三角形,非VAO
  9. 计算机知识和教育管理,计算机教学
  10. mac mini php开发,苹果就不让你升级!新版mac mini真机详细拆解+解析(图)