Lab 6实验报告

2019年春季学期
计算机学院《软件构造》课程

Lab 6实验报告

1 实验目标概述
本次实验训练学生的并行编程的基本能力,特别是 Java 多线程编程的能力。 根据一个具体需求,开发两个版本的模拟器,仔细选择保证线程安全(threadsafe) 的构造策略并在代码中加以实现,通过实际数据模拟,测试程序是否是线程安全 的。另外,训练学生如何在 threadsafe 和性能之间寻求较优的折中,为此计算吞 吐率和公平性等性能指标,并做仿真实验。 ⚫ Java 多线程编程 ⚫ 面向线程安全的 ADT 设计策略选择、文档化 ⚫ 模拟仿真实验与对比分析
2 实验环境配置
简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。

在这里给出你的GitHub Lab6仓库的URL地址(Lab6-学号)。
https://github.com/ComputerScienceHIT/Lab6-1170300532
3 实验过程
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
3.1 ADT设计方案
设计了哪些ADT、各自的作用、属性、方法;设计猴子类、梯子类等等
给出每个ADT的specification;Monkey类用于具体模拟每一只猴子,具有的属性有id、方向、速度以及选择的策略。
Ladder类用于模拟梯子,具有的属性有id和长度。

(可选)以类图形式给出多个类之间的关系。
3.2 Monkey线程的run()的执行流程图
这里无需考虑具体采用的梯子选择策略。
使用monkeythread进行线程处理,进入while循环后首先将暂停标志设为true,判断自身的锁判断标志是否暂停,等待直到主线程调用这个线程这个线程开始工作,将暂停标志设为false,同时notify其他的线程,继续执行猴子的运动过程。如果猴子已经结束运动,那么将这个线程停止并移除
3.3 至少两种“梯子选择”策略的设计与实现方案
3.3.1 策略1
优先选择没有猴子的梯子,若所有梯子上都有猴子,则优先选择没有与我对向而行的猴子的梯子;若满足该条件的梯子有很多,则随机选择;
3.3.2 策略2
优先选择没有猴子的梯子,若所有梯子上都有猴子,则优先选择没有与我对向而行且离我最近的猴子的实际速度最快的梯子。

3.3.3 策略3(可选)
3.4 “猴子生成器”MonkeyGenerator
如何设计和实现。
这个生成器是使用了循环进行实现的,但是整个生成器的调用是通过主线程进行调用的,当决策时间到达需要生成新的猴子的时间的时候,主线程调用猴子生成器生成新的猴子。在生成猴子的方法中,实例化猴子对象和线程对象,并将其加入main类中的一个List中,并且启动这个线程。根据上面的线程内容,我们可以知道,线程首先被暂停,知道主线程唤醒这个进程。

3.5 如何确保threadsafe?
对整个存储所有的梯子的集合加上锁,因为每个线程都对这个集合进行修改。
3.6 系统吞吐率和公平性的度量方案
吞吐率使用猴子个数除以全部过河结束时的时间。
在每只猴子成功过河后,会在一个Map中存储当前的时间,在所有的过河结束后,遍历每一对猴子,根据猴子的id判断猴子生成的时间,通过Map 获取猴子过河的时间,即可计算出公平性。
3.7 输出方案设计
日志使用控制台直接输出
GUI
代码如下
package GUI;

import application.Application;
import factory.MonkeyFactory;
import ladder.Ladder;
import monkey.Monkey;

import javax.swing.;
import java.awt.
;
import java.time.Period;
import java.util.ArrayList;
import java.util.List;

public class GPanel extends JPanel {
private final int WIDTH = 600;
private final int LENGTH = 800;

private final int LADDER_LENGTH = LENGTH - 80;
private final int PER_LENGTH = LADDER_LENGTH / Application.getMc().getLengthofLabber();

private Ladder[] ladders;
private JLabel timeLabel;

public GPanel() {
ladders = Application.getAi().getLadders();
timeLabel = new JLabel(“Current Time: 0”);
timeLabel.setFont(new Font(“Consolas”, Font.BOLD + Font.ITALIC, 20));
add(timeLabel);
}

@Override
public void paint(Graphics g) {
super.paint(g);
timeLabel.setText("Current Time: " + Application.getAi().getTime());
Graphics2D g2 = (Graphics2D) g;
int in = (WIDTH - 80) / (ladders.length * 2);
for (int i = 0;i < Application.getMc().getQuantityofLadders(); i++) {
int up = 20 + in + i * (WIDTH - 80) / Application.getMc().getQuantityofLadders();
int low = 20 + in + PER_LENGTH + i * (WIDTH - 80) / Application.getMc().getQuantityofLadders();
g2.drawLine(40, up, LENGTH - 40, up);
g2.drawLine(40, low, LENGTH - 40, low);
for (int j = 0;j < Application.getMc().getLengthofLabber() - 1; j++) {
g2.drawLine(40 + PER_LENGTH * (j + 1), up, 40 + PER_LENGTH * (j + 1), low);
}
}
for (int i = 0;i < Application.getMc().getQuantityofLadders(); i++) {
Ladder ladder = ladders[i];
int stringy = 20 + in + i * (WIDTH - 80) / Application.getMc().getQuantityofLadders() + PER_LENGTH * 2 / 3;
for (int j = 0;j < Application.getMc().getLengthofLabber(); j++) {
Monkey m = ladder.get(j);
if (m != null) {
g2.drawString(String.valueOf(m.getNumber()), 40 + PER_LENGTH / 4 + PER_LENGTH * j, stringy);
}
}
}
timeLabel.setText("Current Time: " + Application.getAi().getTime());
}

}

可视化(可选)
3.8 猴子过河模拟器v1
3.8.1 参数如何初始化
利用文件读写进行初始化
3.8.2 使用Strategy模式为每只猴子选择决策策略
在每只猴子进行决策时,首先判断这只猴子是否已经在梯子上,如果不在,根据猴子的策略调用不同的策略方法,选择梯子即可。
3.9 猴子过河模拟器v2
在不同参数设置和不同“梯子选择”模式下的“吞吐率”和“公平性”实验结果及其对比分析。
3.9.1 对比分析:固定其他参数,选择不同的决策策略
参数固定为:10个梯子,梯子长20格,每三秒生成25只猴子,共生成500只猴子,猴子的最大速度为7。
仅使用策略1,优先选择没有猴子的梯子,若所有梯子上都有猴子,则优先选择没有与我对向而行的猴子的梯子;若满足该条件的梯子有很多,则随机选择;
测试五次
第一次 第二次 第三次 第四次 第五次 平均
吞吐率 4.10 4.25 4.12 4.33 4.07 4.17
公平性 -0.37 -0.41 -0.42 -0.40 -0.38 -0.40

仅使用策略2,优先选择没有猴子的梯子,若所有梯子上都有猴子,则优先选择没有与我对向而行且离我最近的猴子的实际速度最快的梯子。
测试五次
第一次 第二次 第三次 第四次 第五次 平均
吞吐率 4.40 4.41 4.38 4.41 4.40 4.40
公平性 -0.35 -0.36 -0.33 -0.35 -0.35 0.35

3.9.2 对比分析:变化某个参数,固定其他参数
变化梯子的个数n
n=5 n=10 n=15 n=20
吞吐率 2.27 4.13 5.81 6.10
公平性 -0.349 -0.613 -0.787 -0.845

3.9.3 分析:吞吐率是否与各参数/决策策略有相关性?
根据实验数据来看,梯子的个数与吞吐率相关性较大,但是在提升到一定程度后,由于梯子足够使用,再增加梯子的意义不大,导致相关性下降。决策策略与吞吐率有一定关系,但是影响较小。但是在选择某些特殊策略时,会影响到效率,这个时候出现的差异可能较大。

3.9.4 压力测试结果与分析
500只猴子,每3秒产生70只,共10个梯子,使用随机策略
用时126秒,吞吐率4.098,公平性-0.366,吞吐率和公平性没有明显变化。

3.10 猴子过河模拟器v3
针对教师提供的三个文本文件,分别进行多次模拟,记录模拟结果。
吞吐率 公平性
Competiton_1.txt
第1次模拟 2.097 1
第2次模拟 2.097 1
第3次模拟 2.098 1
第4次模拟 2.103 1
第5次模拟 2.093 1
第6次模拟 2.086 1
第7次模拟 2.097 1
第8次模拟 2.093 1
第9次模拟 2.071 1
第10次模拟 2.103 1
平均值 2.094 1
Competiton_2.txt
第1次模拟 2.576 1
第2次模拟 2.578 1
第3次模拟 2.954 1
第4次模拟 2.983 1
第5次模拟 2.874 1
第6次模拟 2.567 1
第7次模拟 2.753 1
第8次模拟 2.765 1
第9次模拟 2.765 1
第10次模拟 2.764 1
平均值 2.758 1
Competiton_3.txt
第1次模拟 3.414 1
第2次模拟 3.422 1
第3次模拟 3.414 1
第4次模拟 3.432 1
第5次模拟 3.411 1
第6次模拟 3.399 1
第7次模拟 3.409 1
第8次模拟 3.401 1
第9次模拟 3.412 1
第10次模拟 3.414 1
平均值 3.413 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值