OO第二单元电梯线程系列总结作业
电梯系列第一次作业
功能描述:
傻瓜电梯无需考虑超载捎带
线程模式:
Producer-Consumer Pattern
思路:
第一次作业是一个傻瓜电梯,分别有一个生产者生成电梯指令(也就是Input接口),和一个消费者电梯(Process)运行指令和一个电梯调度器,
调度器为生产者和消费者共享,在生产和消费指令时,给队列上同一把锁,再通过wait();和notify();
进行阻塞和唤醒调度器将生产者生产的命令放入电梯中,存放指令的队列使用的是Arrylist。
线程安全:
由于ArrayList的成员方法都不是原子操作的,所以我通过集合Collections.synchronizedList将其转换为一个线程安全的类。

BUG分析:
本次作业较为简单,强测与互测均为出现bug
类图:

电梯系列第二次作业
功能描述:
一部电梯,实现捎带
线程模式:
Producer-Consumer Pattern
思路:
在第一次的基础上进行优化,增加电梯队列,一个是待执行队列(不能实现捎带),
一个是满足电梯运行方向条件,可以进行捎带的队列,调度器里面新增判断电梯的运行方向与指令的运行方向是否一致,
如果一致就加入

否则加入

调度器里还新增了一个电梯目前停靠楼层的原子变量(实现同步),通过判断可捎带的指令所在楼层与电梯目前停靠楼层是否一致来开关门捎带指令。

线程安全:
使用原子变量对部分代码上锁
将线程不安全的Arrylist容器换成线程安全的vector
阻塞和非阻塞的方法使用似乎并不影响线程安全
BUG分析:
(强测与互测均为出现bug)
类图:

电梯系列第三次作业
功能描述:
A,B,C三部电梯,需要实现捎带,最大上限载客人数不同,停靠楼层不同,运行时间不同
线程模式:
WorkerThread
思路:
先判断是否需要换乘电梯,将需要换乘电梯的指令拆分成两条指令,当第一部分的指令运行完之后,
再将第二部分的指令插入相应电梯中执行,不需要实现换乘的指令直接添加到对应电梯的队列中,电梯开关门时,
先出后进,在电梯上限容量搭载乘客,一定程度上节省了部分时间。
线程安全:
在插入换乘指令时,应该先将第一部分的指令放入相应电梯之后再开启子线程判断第一部分指令是否执行完毕(Id是否存在),
若执行完毕即可插入第二部分指令,否则就会出现线程安全,在拆分指令的时候程序就自动ctrl+d,读到的是空指令,
没有办法完成接下来的步骤。所以,应该把设计结构改一下,在第一条指令运行的时候才去启用一个新的线程判断指令是否执行完毕来运行第二条指令。
用原子变量当成锁来对部分代码上锁。
类图:

BUG分析:
Manage类中拆分指令判断出错,有一些楼层不在判断区域内,没有对自己的程序进行充分的测试,
导致没有输出,过了评测机中测后没有对自己的程序进行测试,导致强测挂了5个点。
找BUG:
线程这种事情就是玄学,程序的错误就在那,但是交上去的数据不一定能复现这个错误,所以对于多线程,并没有去下载代码,
而是自己构造测试集对别人的代码进行检测。
测试策略差异:
第一单元是单线程程序,可以设置断点来debug,构造测试样例,根据输出来判断自己的程序是否有错
第二单元是多线程程序,只能依靠程序输出不断缩小代码范围,然后printf出觉得有问题的代码中的一些中间变量来找bug
OO第二单元电梯线程系列总结作业的更多相关文章
- OO第二单元电梯作业总结
目录 目录一.第一次作业分析设计策略基于度量分析程序结构二.第二次作业分析设计策略基于度量分析程序结构三.第三次作业分析设计策略基于度量分析程序结构四.分析自己程序的bug五.发现别人程序bug所采用 ...
- OO第二单元(电梯)单元总结
OO第一单元(求导)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉理解和掌握多线程的思想和方法.这个单元以电梯为主题,从一开始的最简单的单部傻瓜调度(FAFS)电梯到最后的多部 ...
- OO第二单元——电梯作业总结
前言 本单元作业主要以设计电梯来实现多线程编程.本章主要学习了如何使用多线程以及如何确保多线程安全,从电梯的调度策略中学会了如何简单地使用synchronized锁来控制线程安全. 首先,明确锁的两个 ...
- 北航OO第二单元——电梯调度
三次作业要求简介 特点:目的选层电梯 在电梯的每层入口,都有一个输入装置,让每个乘客输入自己的目的楼层.电梯基于这样的一个目的地选择系统进行调度,将乘客运送到指定的目标楼层. 第一次: 在任意时刻输入 ...
- OO第二单元小结
OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...
- 电梯也能无为而治——oo第二单元作业总结
oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...
- oo第二单元作业总结
oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- OO第二单元多线程电梯总结
OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...
随机推荐
- Mybatis Annotation使用小结
Mybatis Annotation使用小结 之前一直有看过mybatis的注解使用方式,但没有去看过它的原理.今天看springboot-mybatis-annotation使用的时候,debug了 ...
- 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)
原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...
- iOS之UIApplicatio、AppDelegate
UIApplication,代表的是整个应用做的事,因此每个程序只能有一个,系统使用的是单例模式,就是[UIApplication sharedApplication]来得到一个实例. 这个单例实例是 ...
- 一、Spring Boot 入门
1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 2014,martin fowler 微服务: ...
- python 字符串常用操作
字符串常用方法 capitalize() String.capitalize() 将字符串首字母变为大写 name = 'xiaoming' new_name = name.capitalize() ...
- open
open服务指的是封装的订单流接口,给外部第三方提供使用.(当然也可以区别的名字,我司这么叫而已,并且是用Java写的,谁晓得为什么不选择PHP来写)通过open api合作方就可以通过调用接口直接下 ...
- Android系统文件目录路径说明
系统数据存储路径,如下:其中应用程序包名为:com.spt ContextWrapper类中,包含以下方法: 1. getFilesDir() --> 内部存储 @Override public ...
- (71)Wangdao.com第十一天_JavaScript 数学对象 Math
Math 对象 封装了数学相关的 属性和方法. 和其他对象不一样,Math 不是一个构造函数,所以不能 new 生成实例, 其所有属性和方法都必须在 Math 对象上调用. 静态属性 Math.PI ...
- ECMA Script 6_行为重定义 Proxy
行为重定义 Proxy 在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截 因此提供了一种机制,可以对外界的访问进行过滤和改写 Proxy 这个词的原意是代理,用在这里表示由它来 ...
- vue_条件渲染_v-if_v-else_v-show
data: { ok: true flag: false } 1. 成对出现的 v-if 和 v-else 原理是: 标签的删除与重新创建 ,有些情况必须用 v-if <p v-if=" ...