并发编程:线程同步基础:3.2、使用两个线程模拟生产者和消费者执行任务。

目录

主要方法

1、主程序

 2、生产者

3、消费者

4、中间队列(主要代码)

5、执行结果


主要方法

  1. wait();  线程等待
  2. notify(); 通知一个等待的线程
  3. notifyAll(); 通知所有等待的线程

1、主程序

package xyz.jangle.thread.test.n2_3.synccondition;
/*** * 	使用两个线程模拟生产者和消费者执行任务。* 	1、生产者将队列填充满之后会通知消费者进行消费。(应该是等待消费者进行消费)*  2、消费者将队列消费为空之后,会通知生产者生产。(应该是等待生产者进行生产2024年1月3日10:10:16)*  *  此处共同使用了EventStorage的对象锁,也就是synchronized方法锁,使用notify()方法进行通知。* @author jangle* @email jangle@jangle.xyz* @time 2020年7月16日 下午10:19:19* */
public class M {public static void main(String[] args) {EventStorage e = new EventStorage();Producer p = new Producer(e);	// 生产者线程Consumer c = new Consumer(e);	// 消费者线程new Thread(p).start();new Thread(c).start();}}

 2、生产者

package xyz.jangle.thread.test.n2_3.synccondition;
/*** @author jangle* @email jangle@jangle.xyz* @time 2020年7月16日 下午10:16:21* */
public class Producer implements Runnable {private EventStorage storage;public Producer(EventStorage storage) {super();this.storage = storage;}@Overridepublic void run() {for(int i=0;i<100;i++) {storage.set();}}}

3、消费者

package xyz.jangle.thread.test.n2_3.synccondition;/*** @author jangle* @email jangle@jangle.xyz* @time 2020年7月16日 下午10:18:00* */
public class Consumer implements Runnable {private EventStorage storage;public Consumer(EventStorage storage) {super();this.storage = storage;}@Overridepublic void run() {for (int i = 0; i < 100; i++)storage.get();}}

4、中间队列(主要代码)

此处共同使用了EventStorage的对象锁,也就是synchronized方法锁,使用notify()方法进行通知。

package xyz.jangle.thread.test.n2_3.synccondition;import java.util.Date;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.TimeUnit;/*** @author jangle* @email jangle@jangle.xyz* @time 2020年7月16日 下午10:04:56* */
public class EventStorage {private int maxSize;private Queue<Date> storage;public EventStorage() {maxSize = 10;storage = new LinkedList<Date>();}public synchronized void set() {while(storage.size() == maxSize) {try {System.out.println("生产满");wait();} catch (InterruptedException e) {e.printStackTrace();}}try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}storage.offer(new Date());System.out.printf("Set: %d",storage.size());notify();}public synchronized void get() {while(storage.size() == 0) {try {System.out.println("消费完");wait();} catch (InterruptedException e) {e.printStackTrace();}}try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}String string = storage.poll().toString();System.out.printf("Get: %d:%s \n",storage.size(),string);notify();}}

5、执行结果

Set: 1Set: 2Set: 3Set: 4Set: 5Set: 6Set: 7Set: 8Set: 9Set: 10生产满
Get: 9:Wed Jan 03 14:37:43 CST 2024 
Get: 8:Wed Jan 03 14:37:43 CST 2024 
Get: 7:Wed Jan 03 14:37:43 CST 2024 
Get: 6:Wed Jan 03 14:37:43 CST 2024 
Get: 5:Wed Jan 03 14:37:43 CST 2024 
Get: 4:Wed Jan 03 14:37:43 CST 2024 
Get: 3:Wed Jan 03 14:37:43 CST 2024 
Get: 2:Wed Jan 03 14:37:43 CST 2024 
Get: 1:Wed Jan 03 14:37:43 CST 2024 
Get: 0:Wed Jan 03 14:37:43 CST 2024 
消费完
Set: 1Set: 2Set: 3Set: 4Set: 5Set: 6Set: 7Set: 8Set: 9Set: 10生产满
Get: 9:Wed Jan 03 14:37:43 CST 2024 
Get: 8:Wed Jan 03 14:37:43 CST 2024 
Get: 7:Wed Jan 03 14:37:43 CST 2024 
Get: 6:Wed Jan 03 14:37:43 CST 2024 
Get: 5:Wed Jan 03 14:37:43 CST 2024 
Get: 4:Wed Jan 03 14:37:43 CST 2024 
Get: 3:Wed Jan 03 14:37:43 CST 2024 
Get: 2:Wed Jan 03 14:37:43 CST 2024 
Get: 1:Wed Jan 03 14:37:43 CST 2024 
Get: 0:Wed Jan 03 14:37:43 CST 2024 
消费完
Set: 1Set: 2Set: 3Set: 4Set: 5Set: 6Set: 7Set: 8Set: 9Set: 10生产满
Get: 9:Wed Jan 03 14:37:43 CST 2024 
Get: 8:Wed Jan 03 14:37:43 CST 2024 
Get: 7:Wed Jan 03 14:37:43 CST 2024 
Get: 6:Wed Jan 03 14:37:43 CST 2024 
Get: 5:Wed Jan 03 14:37:43 CST 2024 
Get: 4:Wed Jan 03 14:37:43 CST 2024 
Get: 3:Wed Jan 03 14:37:43 CST 2024 
Get: 2:Wed Jan 03 14:37:43 CST 2024 
Get: 1:Wed Jan 03 14:37:43 CST 2024 
Get: 0:Wed Jan 03 14:37:43 CST 2024 
消费完
...
...
...

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

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

相关文章

MySQL——事物

目录 一.发现问题 二.什么时事物 三.事务提交方式 四.事物的常规操作方式 五. 事务隔离级别 1.如何理解隔离性 2.隔离级别 3.查看与设置隔离性 4.读未提交【Read Uncommitted】 5.读提交【Read Committed】 6.可重复读【Repeatable Read】 7.串行化【serializabl…

云卷云舒:大型电信运营商应用软件健康度评估方法

大型电信运营商内均会自建云资源池&#xff0c;并基于云资源池构建自己上层应用软件资源&#xff0c;但是各类上层应用软件的故障频发也给运维工作带来了较大的压力&#xff0c;电信运营商急需一种较完善的方法实现对于应用软件的健康度评测&#xff0c;以进一步指导运维完成应…

14、应用层优化

常见问题 什么东西在消耗系统中每台主机的CPU、磁盘、网络&#xff0c;以及内存资源应用真的需要所有获取到的数据吗应用在处理本应由数据库处理的事情吗应用执行了太多的查询吗应用执行的查询太少吗应用创建了没必要的Mysql连接吗应用对一个Mysql实例创建连接的次数太多了吗应…

unity C# 中一看就会的try-catch-finally、throw

文章目录 1、C# 异常处理原理&#xff1a;2、C# 异常处理实用案例&#xff08;简化版示例&#xff09;&#xff1a;3、throw关键字 C# 异常处理是一种用于捕获和处理程序运行时错误的机制&#xff0c;它允许程序在遇到不可预见或非正常条件时进行优雅地恢复或失败。C# 中的异常…

MySQL模糊查询详解

MySQL模糊查询详解 一、什么是模糊查询二、MySQL中的模糊查询2.1 使用LIKE关键字2.2 使用正则表达式&#xff08;REGEXP&#xff09;2.3 使用BETWEEN AND2.4 使用IN操作符2.5 使用IS NULL操作符 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f49…

Rust 圣经 阅读 字符、布尔、单元类型

字符类型&#xff08;char&#xff09; Rust 的字符不仅仅是 ASCII &#xff0c;还包含所有的 Unicode 值&#xff0c;包括单个的中文、日文、表情符号等等。 Unicode 值的范围从 U0000 ~ UD7FF 和 UE000 ~ U10FFFF。 因为每个 Unicode 都是 4 个字节编码&#xff0c;所以字符…

【小白专用】c#之FileStream对象读写大文件

提及文件流&#xff0c;不得不先说以下几个类 FileStream&#xff0c;MemoryStream&#xff0c;NetWorkStream&#xff0c;StreamReader&#xff0c;StreamWriter&#xff0c;TextReader&#xff0c;TextWriter 在用这些类之前&#xff0c;我们先来了解一下这些类的用途以及区别…

知虾皮Shopee:东南亚最受欢迎的电子商务平台

在如今数字化时代&#xff0c;电子商务平台成为人们购物的首选方式。Shopee作为东南亚地区最受欢迎的电子商务平台&#xff0c;通过其多样化的商品、便捷的购物体验和创新的商业模式&#xff0c;迅速在该地区占据了重要地位。本文将详细介绍Shopee的特点和优势&#xff0c;以及…

设计模式 七大原则

1.单一职责原则 单一职责原则&#xff08;SRP&#xff1a;Single responsibility principle&#xff09;又称单一功能原则 核心&#xff1a;解耦和增强内聚性&#xff08;高内聚&#xff0c;低耦合&#xff09;。 描述&#xff1a; 类被修改的几率很大&#xff0c;因此应该专注…

CNN——VGG

1.VGG简介 论文下载地址&#xff1a;https://arxiv.org/pdf/1409.1556.pdf VGGNet 是由牛津大学视觉几何小组&#xff08;Visual Geometry Group, VGG&#xff09;提出的一种深层卷积网络结构&#xff0c;他们以 7.32% 的错误率赢得了 2014 年 ILSVRC 分类任务的亚军&#xff…

Prometheus 监控docker

查看docker运行状态 docker stats 启动docker cadvisor 直接运行docker docker run -d \--volume/:/rootfs:ro \--volume/var/run:/var/run:rw \--volume/sys:/sys:ro \--volume/var/lib/docker/:/var/lib/docker:ro \--publish8080:8080 \--namecadvisor \gcr.io/cadvisor…

2024年MySQL学习指南(二),探索MySQL数据库,掌握未来数据管理趋势

文章目录 前言4. DDL- 操作数据库4.1 查询4.2 创建数据库4.3 删除数据库4.4 使用数据库 5. DDL- 操作数据表5.1 数据类型5.2 查询表5.3 创建表5.4 删除表5.5 修改表 6. 实战案例详解 前言 接上一篇文章【2024年MySQL学习指南&#xff08;一&#xff09;】 4. DDL- 操作数据库 …

2023-2024 年广东省职业院校技能大赛高职组 “软件测试”赛项竞赛规程

2023-2024 年广东省职业院校技能大赛&#xff08;高职组&#xff09; “软件测试”赛项竞赛规程 一、赛项信息 赛项名称&#xff1a;软件测试 赛项编号&#xff1a;GZ034 赛项组别&#xff1a;高职组 二、竞赛目标 软件是新一代信息技术的灵魂&#xff0c;是数字经济发展的基础…

AWS ECS、EC2、EKS 和 Fargate 之间的关系

ECS (Elastic Container Service), EC2 (Elastic Compute Cloud), EKS (Elastic Kubernetes Service), 和 Fargate 是亚马逊 AWS 云平台上的服务&#xff0c;用于容器化应用程序的部署和管理。这些服务之间有一些关联&#xff0c;但它们在实现容器化工作负载的方式上有所不同。…

【docker】linux部署docker

简介 首先我需要声明的是&#xff0c;我的系统是centos7&#xff0c;下载工具使用的是yum&#xff1b;在linux上部署docker&#xff0c;之前一直看的是这篇文章Linux之Docker部署&#xff0c;基本上功能方面也都可以使用&#xff0c;部署起来也是比较的简单。首先我先讲述这篇…

LeetCode 每日一题 Day 32 ||递归单调栈

2487. 从链表中移除节点 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输入&#xff1a;head [5,2,13,3,8] 输出&#xff1a;[13,8] 解释&#xff1a;需要移除的节点是 5 &#xff0c;2 和 3 。…

大数据 - Doris系列《二》- Doris安装(亲测成功版)

目录 &#x1f436;2.1 安装前准备 &#x1f959;1.设置系统最大文件打开句柄数 >启动一个程序的时候&#xff0c;打开文件的数量就是句柄数 &#x1f959;3.时钟同步 &#x1f959;4.关闭交换分区&#xff08;swap&#xff09; &#x1f436;2.2 安装FE &#x1f436…

Prometheus监控redis

Redis 服务 启用 cat >docker-compose.yml<<EOF version: 3 services:redis:image: redis:5container_name: rediscommand: redis-server --requirepass 123456 --maxmemory 512mbrestart: alwaysvolumes:- /data/redis/data:/dataports:- 6379:6379 Redis_exporter…

python基础教程四(字符串相关常用方法)

字符串的方法特别多&#xff0c;这里只介绍一些最用用的。 1:count count方法和列表的count方法类似就是求某个值在字符串中出现了几次 例如: >>a"dsadsdsad" >>a.count() 22:center 方法center通过在俩边添加字符&#xff08;默认是空格&#xff09;让…

论文悦读(7)——NVM文件系统之Trio(SOSP‘23)文件系统

TRIO&#xff08;SOSP23&#xff09; 1. 背景&#xff08;Background&#xff09;1.1 NVM Technologis1.2 File System Customization1.3 Userspace NVM File Systems 2. 观察与动机&#xff08;Observation & Motivation&#xff09;3. 设计与实现&#xff08;Design &…