三种方式实现阻塞队列(简单版)
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();}
}
三种方式实现阻塞队列(简单版)相关推荐
- 微服务中数据聚合的三种方式
在微服务暴热的情形下,似乎不弄点微服务,已经是跟不上IT的大潮了. 因此,公司结合本身情况,以及将来的可拓展性,在我的主导下,在新的项目中采用了微服务架构 然而,实施过程中遇到一个挠头的问题,就是数据 ...
- python定时执行脚本_Python实现定时执行任务的三种方式简单示例
本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 #!/user/bin/env python # @Time :2018/6/7 16:31 ...
- python实现定时任务的方式_Python实现定时执行任务的三种方式简单示例
本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 #!/user/bin/env python # @Time :2018/6/7 16:31 ...
- php简单记账本_代理记账的三种方式
代理记账是指将本企业的会计核算.记账.报税等一系列的会计工作全部委托给专业记账公司完成,本企业只设立出纳人员,负责日常货币收支业务和财产保管等工作.一般来说 代理记账 业务主要分为三个方面分别是专项代 ...
- Tomcat映射虚拟目录的三种方式(2021版)
前言:首先要弄明白什么是TOMCAT的虚拟目录:当WEB应用开发完毕后,如果想要对外发布就需要部署到服务器上面,服务器的主要功能就是需要监听端口.接收和解析访问请求并转发给相应的WEB应用进行处理.比 ...
- python手机版怎么运行项目或脚本-详解python运行三种方式
方式一 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下: $ p ...
- 简单了解计算机网络中数据传输的三种方式
简单理解数据传输:计算机之间实现远程文件和多媒体信息获取和发送的行为. 准确理解数据传输:按照一定的规程,通过一条或者多条数据链路,将数据从数据源传输到数据终端,它的主要作用就是实现点与点之间的信息传 ...
- access下如何配置两个vlan_不同vlan间的通信如何简单配置(三种方式) ?
1.单臂路由(图) 环境:一台路由器,一台二层交换机,两台pc机 二层交换机的配置 一般模式: Switch> 输入enable进入特权模式: Switch>enable 输入config ...
- 简单介绍apache虚拟主机配置的三种方式
本文主要介绍了apache虚拟主机配置的三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 记事本打开httpd.conf文 ...
最新文章
- 从语言学到深度学习NLP,一文概述自然语言处理
- asyncdata连接php,如何使用Nuxt和asyncData观察路由更改
- halcon read_ocr_trainf 从文件中读取训练字符并转换为图像
- day20 java的String
- 将Maven集成到IDEA
- 【操作系统】—进程同步和进程互斥
- java 查找引用_java – Eclipse查找方法的引用
- 十五部必藏之经典日剧(给喜欢怀旧的朋友)--转贴,的确经典,还有很多没看过,不过排名前二都看了,呵呵...
- 赋能泉城 2017中国软件生态大会再下一城
- 2020年十大数字客户体验(CX)软件平台
- 159 samba 无法访问。您可能没有权限使用网络资源 net use命令
- Amy-Tabb机器人世界手眼标定(1、环境搭配)
- 又要数数小绵羊(C++) kkmd66
- 广州计算机行业目前发展趋势,2019年中国广东电子制造业产业发展概况及发展趋势分析[图]...
- mysql的时区设置
- 上海大学计算机学院卞韬,我校计算机工程与科学学院学生在CCPC中国大学生程序设计竞赛中喜获金奖...
- 在Docker中运行EOS(MAC版)
- backports/lzma/_lzmamodule.c:115:18: fatal error: lzma.h: No such file or directory serWarning: Coul
- R/RStudio 常用函数
- convs在MATLAB中,vscon美瞳
热门文章
- 爱了爱了!骚红色机械键盘写代码真香,包邮送!
- 修改wifi密码 及168.192.1.1登录
- 2016天天飞车服务器维护,腾讯天天飞车即将停服,大批老玩家集体上线,这是最后一次飞车了...
- Springboot项目使用jasypt加密配置文件中的敏感信息
- 全面进军国际市场?酷派的手机“野心”拿什么来实现
- OSChina 周六乱弹 —— 防止被讹的正确方法
- JavaScript事件 鼠标事件
- OpenGL使用纯VBO方式渲染出三角形,非VAO
- 计算机知识和教育管理,计算机教学
- mac mini php开发,苹果就不让你升级!新版mac mini真机详细拆解+解析(图)