# 一、需求分析
模拟操作系统进程之间并发执行的原理,及其所引起的同步、互斥问题的方法。
本程序的运行方便简洁,运行结果以图形化的方式展示出来,每个方法的演示是互相独立的,可以多个哲学家进餐方法同时进行演示。用户可以用鼠标直接选择想要展示的方法,对于用户来讲,可以直接观察运行结果,十分方便易用。
输出的形式是将每种状态用一个图来表示和在一个文本框中用文字输出此时每个哲学家所处的状态,共有 4 种状态,即初始化、思考、等待和吃饭状态,每个哲学家思考、吃饭是按顺序的,即思考完后,去吃饭,如果拿不到筷子,就一直等待筷子,直到拿到为止。
# 二、概要设计
1.采用图形的变化和文本的输出来表示哲学家在每个时刻的状态。
2.本程序共 6 个类, 10 个模块,如下:
各个类的功能:
- Main 类:初始化主界面类,它结合 javaFx 提供的可图化界面设计来设计主界面
- MainController 类:处理主界面鼠标选择事件的类,用来创建多个子窗口。
- Service 类:用来存放一些静态共享数据
- StartControl 类:控制运行界面的各种函数和数据
- Chopsticks 类:设置筷子的各种参数和使用方法,例如是否被使用,设置筷子的状态
- Philosopher 类:设置哲学家的思考、等待和吃饭方法。
各个模块的功能:
- 界面设置模块 MainView.fxml,StartView.fxml
- 主程序模块 Main()
- 子窗体弹出模块 onclick1(),onclick2(),onclick3(),onclick4()
- 静态共享资源设置模块 Service()
- 初始化模块 initialize(URL location, ResourceBundle resources)
- 筷子资源设置模块 takeUp(),putDown()
- 哲学家思考方法实现模块 think()
- 哲学家等待方法实现模块 waiting()
- 哲学家吃饭方法实现模块 eat1(),eat2(),eat3(),eat4()
3.主程序的流程图
![](https://www.writebug.com/myres/static/uploads/2022/1/27/586b2176e0b8420636fe021ecaa28d72.writebug)
4.各程序模块之间的层次关系
![](https://www.writebug.com/myres/static/uploads/2022/1/27/8d4dd9cef5aea4779c371b5f04a7545d.writebug)
# 三、详细设计
1.程序中定义的数据类型
Service 类中:
```c++
public static int method=0;
```
分配筷子的方法(0 不做任何处理,1 一次分配所有筷子,2 最多允许 4 个同时拿左边筷子 3 奇数拿左边,偶数拿右边)
```c++
private int leftNum=0;
```
记录拿左边筷子的个数
Philosopher 类中:
```c++
private int state
```
哲学家的状态:
- 0 思考
- 1 左边右边筷子都没拿去吃饭
- 2 已经拿到左边筷子去吃饭
- 3 已经拿到右边筷子去吃饭
- 4 什么没拿等待筷子
- 5 拿到左边筷子等待
- 6 拿到右边筷子等待
吃饭动作包括:拿左边筷子、拿右边筷子、放下筷子,所以去吃饭不一定能成功,可能要等待左右边筷子、拿到左边筷子等待去吃饭和拿到右边筷子等待去吃饭。
```c++
private Chopsticks left;
```
哲学家左边筷子的对象
```c++
private Chopsticks right;
```
哲学家右边筷子的对象
```c++
private ImageView imageView;
```
哲学家的图片 id
```c++
private int id;
```
哲学家的名字
```c++
private int method=0;
```
分配筷子的方法(0 不操作,1 一次分配所有筷子,2 最多允许 4 个同时拿左边筷子,3 奇数拿左边,偶数拿右边)
```c++
private boolean isExit=true;
```
该模拟是否结束
```c++
private TextArea textArea;
```
打印输出内容
```c++
private Service service;
```
Service 对象
2.子窗体弹出模块
根据主界面选择的方法来弹出相应的窗口,并通过设置 method 的值来记录当前演示方法
1.不做任何处理方法窗体弹出
```
onclick1(MouseEvent mouseEvent) {
设置 method 的值为 1
新建窗体
}
```
2.一次分配所有筷子方法窗体弹出
```
Onclick2(MouseEvent mouseEvent) {
设置 method 的值为 2
新建窗体
}
```
3.最多允许 4 个同时拿左边筷子方法窗体弹出
```
onclick1(MouseEvent mouseEvent) {
设置 method 的值为 3
新建窗体
}
```
4.奇数拿左边,偶数拿右边方法窗体弹出
```
onclick1(MouseEvent mouseEvent) {
设置 method 的值为 4
新建窗体
}
```
3.初始化模块
根据子窗口弹出的时候初始化数据
(1)initialize-页面初始化监听方法
输入值:URL location, ResourceBundle resources
返回值:无
调用模块:调用 chopsticks 类和 philosophers 类创建对象实体
功能设计:
- 获取界面的按钮、文本和图片 id
- 创建 5 个筷子对象
- 以本哲学家的左右筷子对象、对应的图片 id、进餐方法文本框的 id,service 对象为参数,创建 5 个 Philosopher 对象
(2)start()-点击开始按钮开始模拟方法
输入值:ActionEvent event
返回值:无
调用模块:调用 Philosopher 对象的运行方法
功能设计:
- 设置 Philosopher 对象不终止
- 运行 Philosopher 进程
(3)exit()-点击结束按钮结束模拟方法
- 输入值:ActionEvent event
- 返回值:无
- 功能设计:停止运行 Philosopher 进程
4.筷子资源设置模块
(1)takeUp()-哲学家拿起左/右筷子的方法
输入值:Philosopher 对象
返回值:true/false
功能设计:
```
If(筷子未被使用){
设置筷子为使用状态
不显示筷子的图片
打印筷子被哲学家使用文本
返回 true
} else {
返回 false
}
```
(2)putDown()-哲学家放下左/右筷子的方法
输入值:Philosopher 对象
返回值:无
功能设计:
- 设置筷子为未占用状态
- 显示筷子的图片
- 打印筷子被哲学家放下文本
5.哲学家思考方法实现模块
(1)think()-哲学家思考的方法
输入值:无
返回值:无
功能设计:
```
If(state 状态为 0){
打印哲学家正在思考文本
设置哲学家为思考图片
设置哲学家状态 state 为 1,即吃饭状态(手上没筷子)
}
```
6.哲学家等待方法实现模块
(1)waiting()-哲学家等待的方法
输入值:无
返回值:无
功能设计:
```
If(state状态为4) { --什么没拿等待
打印文本
设置哲学家为等待图片
设置哲学家状态 state 为 1,即吃饭状态(手上没筷子)
} else if(state状态为5) { --拿到左边筷子等待
打印文本
设置哲学家为等待图片
设置哲学家状态 state 为 2,即吃饭状态(手上有左边筷子)
} else if(state状态为6) { --拿到右边筷子等待
打印文本
设置哲学家为等待图片
设置哲学家状态 state 为 3,即吃饭状态(手上有右边筷子)
}
```
7.哲学家吃饭方法实现模块
(1)eat1()-哲学家不做任何处理进餐
输入值:无
返回值:无
功能设计:
```
If(state状态为1) { --什么没拿吃饭
If(拿左边筷子){
If(拿右边筷子){
设置哲学家状态 state 为 0,即思考状态
打印文本
设置哲学家为吃饭图片
放下右边筷子
放下左边筷子
} else {
设置哲学家状态 state 为 5,即拿到左边筷子等待
调用等待方法
}
} else {
设置哲学家状态 state 为 4,即手上没有筷子等待
调用等待方法
}
} else if(state状态为2) {
--拿到左边筷子去吃饭
If(拿右边筷子){
设置哲学家状态 state 为 0,即思考状态
打印文本
设置哲学家为吃饭图片
放下右边筷子
放下左边筷子
} else {
设置哲学家状态 state 为 5,即拿到左边筷子等待
调用等待方法
}
}
```
(2)eat2()-一次分配所有筷子进餐
输入值:无
返回值:无
功能设计:
```
If(state状态为1) { --什么没拿吃饭
If(拿左边筷子){
If(拿右边筷子){
设置哲学家状态 state 为 0,即思考状态
打印文本
设置哲学家为吃饭图片
放下右边�
基于Java解决哲学家进餐问题【100012404】
版权申诉
70 浏览量
2023-05-24
14:12:14
上传
评论
收藏 809KB ZIP 举报
神仙别闹
- 粉丝: 2674
- 资源: 7640
最新资源
- HM2305B-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 基于52单片机、ADC0832、LCD1602、两个74HC393和一个74HC08的频率测量计 不能用,请私我
- HM2302-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- python实战项目-学生成绩管理系统(基础版)
- 微信小程序源码 实现查公交 滴滴公交 app 源码下载
- HM2302E-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 基于C#图片相似度比较,感知哈希算法
- VR开发的概要介绍与分析
- 自动驾驶定位系列教程七:点云畸变补偿.pdf
- HM2302D-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈