模拟生产者和消费者

news/2024/12/14 20:29:43/文章来源:https://www.cnblogs.com/damour-damocles/p/18606976

1、使用多线程模拟生产者和消费者

class ShareData {private int number = 0;private Lock lock = new ReentrantLock();private Condition condition = lock.newCondition();public void increment() throws Exception {lock.lock();try {//多线程的判断必须要用whilewhile (number != 0) {//释放当前锁,进入等待状态,不能生产//唤醒线程从await()返回后需要重新获得锁condition.await();}//生产number++;System.out.println(Thread.currentThread().getName() + "\t" + number);//通知唤醒所有等待线程condition.signalAll();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public void decrement() throws Exception {lock.lock();try {//多线程的判断必须要用whilewhile (number != 1) {//释放当前锁,进入等待状态,不能消费//唤醒线程从await()返回后需要重新获得锁condition.await();}//消费number--;System.out.println(Thread.currentThread().getName() + "\t" + number);//通知唤醒所哟等待线程condition.signalAll();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}
}public class ProducerConsumer {public static void main(String[] args) {ShareData shareData = new ShareData();new Thread(()->{for (int i = 0; i < 10; i++) {try {shareData.increment();} catch (Exception e) {e.printStackTrace();}}}, "A").start();new Thread(()->{for (int i = 0; i < 10; i++) {try {shareData.decrement();} catch (Exception e) {e.printStackTrace();}}}, "B").start();}
}

2、使用阻塞队列方式模拟生产者和消费者

class ShareResource {//默认开启,进行生产+消费private volatile boolean FLAG = true;private AtomicInteger atomicInteger = new AtomicInteger();BlockingQueue<String> blockingQueue = null;public ShareResource(BlockingQueue<String> blockingQueue) {this.blockingQueue = blockingQueue;System.out.println(blockingQueue.getClass().getName());}public void produce() throws InterruptedException {String data = null;boolean retValue;while (FLAG) {data = atomicInteger.incrementAndGet() + "";retValue = blockingQueue.offer(data, 2L, TimeUnit.SECONDS);if (retValue) {System.out.println(Thread.currentThread().getName() + "\t 插入队列" + data + "成功");} else {System.out.println(Thread.currentThread().getName() + "\t 插入队列" + data + "失败");}TimeUnit.SECONDS.sleep(1);}System.out.println(Thread.currentThread().getName() + "\tFLAG=false,生产结束");}public void consume() throws InterruptedException {String data = null;while (FLAG) {data = blockingQueue.poll(2L, TimeUnit.SECONDS);if (null == data || data.equalsIgnoreCase("")) {FLAG = false;System.out.println(Thread.currentThread().getName() + "\t 超过2秒钟没有取到数据,消费退出");System.out.println();return;}System.out.println(Thread.currentThread().getName() + "\t消费数据" + data + "成功");}}public void stop() {this.FLAG = false;}
}public class ProducerAndConsumer {public static void main(String[] args) throws InterruptedException {ShareResource shareResource = new ShareResource(new ArrayBlockingQueue<String>(10));new Thread(() -> {System.out.println(Thread.currentThread().getName() + "生产线程启动");try {shareResource.produce();} catch (InterruptedException e) {e.printStackTrace();}}, "Producer").start();new Thread(() -> {System.out.println(Thread.currentThread().getName() + "消费线程启动");try {shareResource.consume();} catch (InterruptedException e) {e.printStackTrace();}}, "Consumer").start();TimeUnit.SECONDS.sleep(5);System.out.println("5秒钟时间到,活动结束");shareResource.stop();}
}

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/852649.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机做的所有事情都叫计算

计算机怎么解决问题?答:需要告诉计算机解决问题的步骤(不要写成说明书了) 怎么告诉计算机这个步骤?答:编程语言写程序 1. 写程序不是表达关系,是表达动作2. 是解决问题的步骤,编程的时候不是你说一句它做一句3. 编程语言不是用来和计算机交流的4. 计算机的交流是你的操…

第四章 文件管理

文件 4.1.1 文件的基本概念文件是指由创建者所定义的、具有文件名的一组相关元素的集合,是以硬盘为载体的存储在计算机上的信息集合 是文件系统中最大的数据单位 在用户进行的输入,输出中,则以文件为基本单位4.1.5 文件的逻辑结构 按文件是否有结构分类 无结构文件 文件内部…

程序执行两种方式

1.你写的程序交文件给它,它一步步按照你的要求执行 2.写的程序文件交给它,它翻译成计算机懂的文件,用计算机懂的文件执行 解释语言vs编译语言1. 语言本身没有解释和编译的区分,任何语言都可以编译执行和解释执行。2. 只是语言常用执行方式的传统和习惯的问题3. 解释语言 特…

P1070 [NOIP2009 普及组] 道路游戏

ProblemSolve 此题是求最优解,考虑贪心时会发现这个不满足局部最优->整体最优,故考虑DP 通过输入格式能受到启发,时间可以作为维度之一,所以定义为: \(f_{i,j}\)第i秒末,机器人在j号工厂能获得的最大金币 因为机器存在时间有上限,所以推的时候枚举本次机器人到底走了多…

2024-12-14:K 周期字符串需要的最少操作次数。用go语言,给定一个长度为n的字符串 word 和一个整数k,k是n的因数。每次操作可以选择两个下标i和j,使得i和j都可以被k整除,然后用从j

2024-12-14:K 周期字符串需要的最少操作次数。用go语言,给定一个长度为n的字符串 word 和一个整数k,k是n的因数。每次操作可以选择两个下标i和j,使得i和j都可以被k整除,然后用从j开始的长度为k的子串替换从i开始的长度为k的子串。要使得word成为一个K周期字符串,需要进行…

实现综合实例:简单文字处软件 (一)

学业繁重,更新缓慢。 本内容主要用于个人学习/复习QT简单入门控件 DAY ONE 创建项目界面设计与开发 实现简单的菜单栏设计本人并没有使用代码实现,而是用于使用UI设计师界面。action条例分类 设计控件(帮助) 设计帮助控件: 我们转到槽,填写如下代码: 这是一个基于QT6实现…

微信防撤回插件

插件 https://pan.quark.cn/s/bb5165185a6a部署 先查看电脑微信版本,比如我这里是3.9.12.15版本下载对应版本之后,将插件名字改为WeChatWin.dll,删掉前面的版本号在微信所在的文件夹下,找到这个同名插件,用下载的插件替换它即可 end 替换之后需要重启微信才可以,效果如下…

事务管理与锁机制

title: 事务管理与锁机制 date: 2024/12/14 updated: 2024/12/14 author: cmdragon excerpt: 在数据库系统中,事务管理至关重要,它确保多个数据库操作能够作为一个单一的逻辑单元来执行,从而维护数据的一致性和完整性。一个良好的事务管理系统能够解决并发操作带来的问题,…

2024-2025-1 20241319 《计算机基础与程序设计》第十二周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12这个作业的目标 结构体和数据结构基础 文件操作作业正文 https://www.cnblogs.com/wchxx/p/18607077教材学习内容总结 结构体(Struct…

数据采集综合设计

这个项目属于哪个课程2024数据采集与融合技术实践 组名 从你的全世界爬过团队logo:项目简介 项目名称:博物识植项目logo:项目介绍:在探索自然奥秘的旅途中,我们常与动植物相伴而行,却无法准确识别它们,更难以深入了解他们的特征。为了更好地理解和欣赏自然界的多样性,…

Java中创建线程的几种方式

盘点一下Java中创建线程的几种方式 一、继承Thread类,重写run()方法public class MyThread extends Thread {@Overridepublic void run() {System.out.println("my thread start " + Thread.currentThread().getName());}public static void main(String[] args) {S…

消防通道堵塞识别摄像机

消防通道堵塞识别摄像机是一种安装在建筑物消防通道中的监控设备,主要用于监测消防通道是否被车辆、杂物或其他障碍物所堵塞,以确保在火灾等紧急情况下消防通道畅通无阻。这种摄像机通常安装在消防通道的入口或周围,具备高清摄像功能,能够全天候监测通道状况。一旦摄像机检…