包子线程问题

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

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5