java模拟理发师睡觉问题

2023-12-25 20:59

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

        前言

                看操作系统的IPC问题发现有个理发师睡觉问题觉得挺有意思,然后想着用java模拟一下,因为平时也比较垃圾,作为初级猿没怎么用过多线程,刚好练着玩玩,然后中间遇到点问题就想着直接找百度看看标答,结果发现没怎么有相关的帖子,最后写出了个简陋版,分享一下,仅作参考,我这估计大佬们看着会看出写问题来,有问题提,但我不一定及时看到。

        题目:

                理发店里有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子。如果没有顾客,则理发师便在理发椅上睡觉,如图2-20所示。当一个顾客到来时,他必须先叫醒理发师,如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,他们就坐下来等。如果没有空椅子,他就离开。

        图片是《操作系统的设计与实现》中的插图,我这里实现是把椅子数设为6,然后设置只有一个理发师,所以我直接用的一个布尔标识的理发师是否睡觉。

代码实现

接下来是我捣鼓出来的简单的代码:(这么还是检测说我质量不行,我都回锅了!!!)

/*** @author liuLiang* @create 2022/5/29 10:10* @email kekorand@gmail.com* @Description 理发IPC问题,简述,理发师,顾客,椅子* 顾客看见等待的人数小于椅子的个数就进来* 要是顾客数为零理发师就休眠*/
public class HaircutIPC {// 等候理发的顾客(不包括正在理发的顾客)public static volatile int customers;// 理发师是否睡眠public static volatile boolean isSleep;// 椅子数public static final int chair = 6;public static void main(String[] args) {// 理发师线程,如果等待理发的顾客数为零就睡眠,不为零就起来理发Thread haircutT = new Thread(()->{while (true){// 控制循环速度try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}if (HaircutIPC.isSleep) {System.out.println("理发师在睡觉!");continue;}if (HaircutIPC.customers > 0){//剪头try {System.out.println("开始剪头------------------->顾客数" + customers);Thread.sleep(HaircutIPC.getRandomLong());HaircutIPC.customers--;System.out.println("结束剪头------------------->顾客数" + customers);} catch (InterruptedException e) {e.printStackTrace();}}else {// 睡觉HaircutIPC.isSleep = true;System.out.println("理发师睡觉了");}}});// 顾客线程,看看等待理发的顾客数量是否小于椅子数,小于就进来等,不然就不进来,要是理发师睡了还得喊一下理发师Thread customerT = new Thread(()->{while (true){// 控制随机间隔1-10秒try {Thread.sleep(HaircutIPC.getRandomLong());} catch (InterruptedException e) {e.printStackTrace();}if (HaircutIPC.chair > HaircutIPC.customers){HaircutIPC.customers ++;// 在睡觉就喊起来if (HaircutIPC.isSleep){System.out.println("理发师起来干活了快");HaircutIPC.isSleep = false;}System.out.println(Thread.currentThread().getName() + "--->进入顾客一个,顾客数" + customers);}}});customerT.setName("customerT");haircutT.setName("haircutT");haircutT.start();customerT.start();}/*** 获得一个随机秒数* @return*/public static long getRandomLong(){return new Double(Math.random()*10000).longValue();}}

运行结果

               运行结果如下:

         

后续

        我是真的不懂这玩意为啥说我这质量不行,我就随便谢谢而已,主要是它给我报红我觉得看起来好别扭好别扭。

        我这感觉也没什么违规的啊,图片正常,没有广告,外链也没有,有代码也,这什么鬼发文助手哦,会不会玩,不会玩别玩了。我这再怎么说它至少是自己手写的啊。

 

这篇关于java模拟理发师睡觉问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java资源管理和引用体系的使用详解

《Java资源管理和引用体系的使用详解》:本文主要介绍Java资源管理和引用体系的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Java的引用体系1、强引用 (Strong Reference)2、软引用 (Soft Reference)3、弱引用 (W

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

Idea插件MybatisX失效的问题解决

《Idea插件MybatisX失效的问题解决》:本文主要介绍Idea插件MybatisX失效的问题解决,详细的介绍了4种问题的解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录一、重启idea或者卸载重装MyBATis插件(无需多言)二、检查.XML文件与.Java(该文件后缀Idea可能会隐藏

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

Java如何根据文件名前缀自动分组图片文件

《Java如何根据文件名前缀自动分组图片文件》一大堆文件(比如图片)堆在一个目录下,它们的命名规则遵循一定的格式,混在一起很难管理,所以本文小编就和大家介绍一下如何使用Java根据文件名前缀自动分组图... 目录需求背景分析思路实现代码输出结果知识扩展需求一大堆文件(比如图片)堆在一个目录下,它们的命名规

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

Java中的内部类和常用类用法解读

《Java中的内部类和常用类用法解读》:本文主要介绍Java中的内部类和常用类用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录内部类和常用类内部类成员内部类静态内部类局部内部类匿名内部类常用类Object类包装类String类StringBuffer和Stri

Nginx 访问 /root/下 403 Forbidden问题解决

《Nginx访问/root/下403Forbidden问题解决》在使用Nginx作为Web服务器时,可能会遇到403Forbidden错误,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录解决 Nginx 访问 /root/test/1.html 403 Forbidden 问题问题复现Ng

Java实现MinIO文件上传的加解密操作

《Java实现MinIO文件上传的加解密操作》在云存储场景中,数据安全是核心需求之一,MinIO作为高性能对象存储服务,支持通过客户端加密(CSE)在数据上传前完成加密,下面我们来看看如何通过Java... 目录一、背景与需求二、技术选型与原理1. 加密方案对比2. 核心算法选择三、完整代码实现1. 加密上

Python的pip在命令行无法使用问题的解决方法

《Python的pip在命令行无法使用问题的解决方法》PIP是通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载、更新等功能,安装诸如Pygame、Pymysql等Pyt... 目录前言一. pip是什么?二. 为什么无法使用?1. 当我们在命令行输入指令并回车时,一般主要是出现以