包子线程问题

2024-03-14 09:08
文章标签 问题 线程 包子

本文主要是介绍包子线程问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Thread包子线程

在这里插入图片描述

创建包子对象

含有:皮,馅,包子的状态:有true,,没有false

代码:

public class BaoZi {
String pi;
String xian;
boolean flag=false;
}

创建包子生产者进程

生产者(包子铺)类是一个线程类,可以继承Thread
设置线程任务run:生产包子
对包子的状态进行判断
true:有包子
包子铺调用wait方法进入等待状态
false:没有包子
包子铺生产包子
增加一些趣味性:交替生产两种包子(i%2==0)
包子生产好了包子
修改包子状态为true唤醒吃货进程:让吃货开始吃包子
注意:

  • 包子铺线程和包子线程关系------通信(互斥)
  • 必须同时同步保证两个线程只有一个在执行
  • 锁对象必须保证唯一,可以使用包子对象为锁对象
  • 包子铺类和吃货类就需要将包子对象作为传递参数传递过来
    1.需要在成员位置创建一个包子遍历
    2.使用带参数的构造方法,为这个包子变量赋值

代码:

public class BaoZiPu extends Thread {
private BaoZi bz;public BaoZiPu(BaoZi bz) {this.bz = bz;
}@Override
public void run() {int count=0;while (true){synchronized (bz){//对包子状态进行判断if(bz.flag==true) {//有包子就等待try {bz.wait();} catch (InterruptedException e) {e.printStackTrace();}}//没有包子,被唤醒之后执行,包子铺生产包子,增加一些趣味性,交替生产两种包子if(count%2==0){bz.pi="薄皮";bz.xian="三鲜馅";}else{bz.pi="冰皮";bz.xian="牛肉大葱馅";}count++;System.out.println("包子铺正在生产:"+bz.pi+bz.xian+"包子");//生产包子需要等待3秒钟try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//生产完毕后修改包子状态为有bz.flag=true;//唤醒吃货进程,吃货可以开始吃了bz.notify();System.out.println("包子铺已经生产好了:"+bz.pi+bz.xian+"包子,吃货可以吃了!");}}
}
}

创建吃货进程

消费者类:是一个线程类,可以继承Thread
设置线程任务(run):吃包子
对包子的状态进行判断
false没有包子
吃货调用wait方法进入等待
true有包子

吃货吃包子,吃完包子,修改包子的状态为false没有,吃货唤醒包子铺线程,生产包子

代码:

public class ChiHuo extends Thread{
private  BaoZi bz;
public ChiHuo(BaoZi bz) {this.bz = bz;
}
@Override
public void run() {while (true){synchronized (bz){if(bz.flag==false) {//包子没有,顾客等待try {bz.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("吃货正在吃:"+bz.pi+bz.xian+"包子");bz.flag=false;bz.notify();System.out.println("吃货吃完了:"+bz.pi+bz.xian+"包子,包子铺开始生产包子");System.out.println("-----------------------------------------------------");}}
}
}

创建测试类:

void wait()
导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法。
void notify()
唤醒正在等待对象监视器的单个线程。
void notifyAll()
唤醒正在等待对象监视器的所有线程。
void wait(long timeout)
导致当前线程等待,直到另一个线程调用 notify()方法或该对象的 notifyAll()方法,或者指定的时间已过。 过了这段时间自动唤醒自己

代码:

public class DemoTest {
public static void main(String[] args) {BaoZi bz=new BaoZi();//创建包子铺进程,开始生产包子;new BaoZiPu(bz).start();//创建吃货进程,开启,吃包子new ChiHuo(bz).start();
}
}

显示效果:

包子铺正在生产:薄皮三鲜馅包子
包子铺已经生产好了:薄皮三鲜馅包子,吃货可以吃了!
吃货正在吃:薄皮三鲜馅包子
吃货吃完了:薄皮三鲜馅包子,包子铺开始生产包子

包子铺正在生产:冰皮牛肉大葱馅包子
包子铺已经生产好了:冰皮牛肉大葱馅包子,吃货可以吃了!
吃货正在吃:冰皮牛肉大葱馅包子
吃货吃完了:冰皮牛肉大葱馅包子,包子铺开始生产包子

包子铺正在生产:薄皮三鲜馅包子
包子铺已经生产好了:薄皮三鲜馅包子,吃货可以吃了!
吃货正在吃:薄皮三鲜馅包子
吃货吃完了:薄皮三鲜馅包子,包子铺开始生产包子

这篇关于包子线程问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/807921

相关文章

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对