包子线程问题

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

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异