# 一、需求分析
模拟操作系统进程之间并发执行的原理,及其所引起的同步、互斥问题的方法。
本程序的运行方便简洁,运行结果以图形化的方式展示出来,每个方法的演示是互相独立的,可以多个哲学家进餐方法同时进行演示。用户可以用鼠标直接选择想要展示的方法,对于用户来讲,可以直接观察运行结果,十分方便易用。
输出的形式是将每种状态用一个图来表示和在一个文本框中用文字输出此时每个哲学家所处的状态,共有 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,即思考状态
打印文本
设置哲学家为吃饭图片
放下右边�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:设计报告word+项目源码 实现一个模拟哲学家进餐问题的系统,要求用户选用哪一种算法进行哲学家进餐演示。 Main 类:初始化主界面类,它结合 javaFx 提供的可图化界面设计来设计主界面 MainController 类:处理主界面鼠标选择事件的类,用来创建多个子窗口。 Service 类:用来存放一些静态共享数据 StartControl 类:控制运行界面的各种函数和数据 Chopsticks 类:设置筷子的各种参数和使用方法,例如是否被使用,设置筷子的状态 Philosopher 类:设置哲学家的思考、等待和吃饭方法。 详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/122802325?spm=1001.2014.3001.5502
资源推荐
资源详情
资源评论
收起资源包目录
基于Java窗体实现的模拟哲学家进餐演示系统.zip (63个子文件)
eating
设计报告.docx 2.23MB
LICENSE 1KB
Eating
JF01.iml 425B
src
css
css1.css 223B
img
刀子.png 9KB
init.png 15KB
beijin1.jpg 71KB
eating.png 24KB
thinking.png 24KB
1.png 6KB
icon.jpg 26KB
2.png 7KB
4.png 7KB
waiting.png 22KB
3.png 7KB
beijin.jpg 47KB
META-INF
MANIFEST.MF 52B
application
MainView.fxml 4KB
Main.java 677B
unitils
Chopsticks.java 2KB
Philosopher.java 12KB
controller
StartControl.java 4KB
MainController.java 2KB
StartView.fxml 4KB
Service.java 1003B
.idea
uiDesigner.xml 9KB
gradle.xml 139B
misc.xml 493B
vcs.xml 166B
description.html 188B
modules.xml 248B
encodings.xml 159B
compiler.xml 711B
.gitignore 176B
artifacts
JF01_jar.xml 270B
out
production
JF01
css
css1.css 223B
img
刀子.png 9KB
init.png 15KB
beijin1.jpg 71KB
eating.png 24KB
thinking.png 24KB
1.png 6KB
icon.jpg 26KB
2.png 7KB
4.png 7KB
waiting.png 22KB
3.png 7KB
beijin.jpg 47KB
META-INF
MANIFEST.MF 52B
application
MainView.fxml 4KB
Main.class 1KB
unitils
Philosopher.class 8KB
Chopsticks.class 3KB
controller
MainController.class 2KB
Service.class 1KB
StartControl.class 4KB
StartView.fxml 4KB
artifacts
JF01_jar
.idea
misc.xml 174B
JF01_jar.iml 336B
modules.xml 268B
workspace.xml 2KB
JF01.jar 266KB
README.md 13KB
共 63 条
- 1
shejizuopin
- 粉丝: 9487
- 资源: 1288
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页