1 实验目标概述
本次实验训练学生的并行编程的基本能力,特别是 Java 多线程编程的能力。
根据一个具体需求,开发两个版本的模拟器,仔细选择保证线程安全(threadsafe)
的构造策略并在代码中加以实现,通过实际数据模拟,测试程序是否是线程安全
的。另外,训练学生如何在 threadsafe 和运行性能之间寻求较优的折中,为此计
算吞吐率等性能指标,并做仿真实验。
Java 多线程编程
面向线程安全的 ADT 设计策略选择、文档化
模拟仿真实验与对比分析
基本的 GUI 编程
2 实验环境配置
简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
在这里给出你的GitHub Lab6仓库的URL地址(Lab6-学号)。
3 实验过程
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
3.1 ADT设计方案
设计了哪些ADT、各自的作用、属性、方法;
首先设计了Monkey的ADT:
然后设计了LadderADT:
然后是monkeyGenerator 的ADT:
给出每个ADT的specification:
Monkey类它的作用是,产生猴子,并且利用构造函数为猴子的属性作定义。同时这个类又是继承的Thread类,相当于一个猴子就是一个线程。
方法包括:
构造函数:
Monkey();
get_ID();
get_direction();
get_v;
run();
由于每个猴子的参数都不同,所以在猴子生成的时候直接赋值即可。
Ladder类的作用是,产生n个梯子,给梯子的属性作定义。
主要的方法有:
set_name();
get_name();
pedal1();
pedal2();
…
pedaln();
empty();
set_Monkeys();
分别表示,给梯子命名,拿出梯子的名,和梯子的20级阶梯上是否有猴子。
Empty方法用来判断梯子是不是空的,set_Monkeys表示如果梯子是空的,就让选择了该梯子的猴子上去。
monkeyGenerator类的作用:
读入文件,正则表达式匹配,提取出所有六个变量的值。
产生一堆N个猴子,给每猴子定义ID,方向和速度属性。
开始让猴子线程启动。
主要的方法有:
main();
creatMonkey();
(可选)以类图形式给出多个类之间的关系。
用UML插件生成的类图如下:
3.2 Monkey线程的run()的执行流程图
3.3 至少两种“梯子选择”策略的设计与实现方案
3.3.1 策略1
优先选择没有猴子的梯子,若所有梯子上都有猴子,则优先
选择没有与我对向而行的猴子的梯子;若满足该条件的梯子有很多,
则随机选择;
策略为:遍历所有梯子, 如果有梯子为空, 这直接选择这个梯子, 否则就去选方向一致的梯子.
代码如下:
3.3.2 策略2
优先选择没有猴子的梯子,若所有梯子上都有猴子,则在岸
边等待,直到某个梯子空闲出来;
代码如下:
3.3.3 策略3(可选)
3.4 “猴子生成器”MonkeyGenerator
首先要读入文件,初始化变量。然后用creatMonkey方法生成N只猴子,N只猴子要分批次生成,每隔t秒生成k个猴子,因此采用sleep函数,使得程序每运行一次都休眠t秒。
生成猴子后猴子的ID,方向,速度都通过Monkey类里面的构造函数随机确定了。
然后只需要通过start函数使线程启动即可。
3.5 如何确保threadsafe?
对于梯子进行的所有操作都加上锁。
需要解决的问题:1猴子对梯子的竞争,2 猴子对踏板的竞争
解决第一个问题的时候,当一个猴子进程选择梯子的时候,所有的梯子都是锁住的。猴子选择的那个梯子解锁。这样虽然可能会花费时间比较多,但是会解决竞争问题。
解决第二个问题的时候,是需要挨个对踏板进行解锁,一个一个去判断。
3.6 系统吞吐率和公平性的度量方案
个主要是根据实验手册中给出的公式来进行计算。吞吐率表示每秒过河的猴子的数目,Th=N/T。
“公平性”是指:如果 Monkey 对象 A 比 Monkey B 出生得更早,那么A 应该比 B 更早抵达对岸,则为“公平”;若 A 比 B 晚到对岸,则为“不公平”。
公式为:
3.7 输出方案设计
代码:
生成到文件:
3.8 猴子过河模拟器v1
3.8.1 参数如何初始化
文件:
如图。
采用读文件的方法直接将文本读入,然后用逗号进行分割,然后正则表达式去匹配,从而将变量给初始化。
显然group(1)就是变量的值。
该方法可以支持多次模拟,每次模拟使用不同的参数值配置,均在配置文件里定义,比较方便省事,因此采用这种方法来进行初始化参数。
3.8.2 使用Strategy模式为每只猴子选择决策策略
首先要有一个strategy接口。
然后用两种策略去实现:
3.9 猴子过河模拟器v2
在不同参数设置和不同“梯子选择”模式下的“吞吐率”和“公平性”实验结果及其对比分析。
3.9.1 对比分析:固定其他参数,选择不同的决策策略
固定这些参数:
选择策略一时:
吞吐率为:1.122222
公平性为:0.244444
选择策略二时:
吞吐率为:1.122222
公平性为:0.411111
3.9.2 对比分析:变化某个参数,固定其他参数
在策略一的模式下,其他参数固定的情况下,变化n。
n=1时:
吞吐率为:1.122222
公平性为:0.244444
n=2时:
吞吐率为:1.011111
公平性为:0.024444
3.9.3 分析:吞吐率是否与各参数/决策策略有相关性?
根据实验结果, 可以看出来吞吐率和策略是有关的, 策略不同,吞吐率一般都不相同。同时发现,参数不同也会影响吞吐率,参数对吞吐率的影响更大一些。