电梯系列第一次作业

功能描述:

傻瓜电梯无需考虑超载捎带

线程模式:

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第二单元电梯线程系列总结作业的更多相关文章

  1. OO第二单元电梯作业总结

    目录 目录一.第一次作业分析设计策略基于度量分析程序结构二.第二次作业分析设计策略基于度量分析程序结构三.第三次作业分析设计策略基于度量分析程序结构四.分析自己程序的bug五.发现别人程序bug所采用 ...

  2. OO第二单元(电梯)单元总结

    OO第一单元(求导)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉理解和掌握多线程的思想和方法.这个单元以电梯为主题,从一开始的最简单的单部傻瓜调度(FAFS)电梯到最后的多部 ...

  3. OO第二单元——电梯作业总结

    前言 本单元作业主要以设计电梯来实现多线程编程.本章主要学习了如何使用多线程以及如何确保多线程安全,从电梯的调度策略中学会了如何简单地使用synchronized锁来控制线程安全. 首先,明确锁的两个 ...

  4. 北航OO第二单元——电梯调度

    三次作业要求简介 特点:目的选层电梯 在电梯的每层入口,都有一个输入装置,让每个乘客输入自己的目的楼层.电梯基于这样的一个目的地选择系统进行调度,将乘客运送到指定的目标楼层. 第一次: 在任意时刻输入 ...

  5. OO第二单元小结

    OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...

  6. 电梯也能无为而治——oo第二单元作业总结

    oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...

  7. oo第二单元作业总结

    oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...

  8. 【OO学习】OO第二单元作业总结

    OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...

  9. OO第二单元多线程电梯总结

    OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...

随机推荐

  1. 安装 Tensorflow

    环境:Ubuntu 16.04  64bit 1.    安装Anaconda Anaconda 是 Python 的一个科学计算发行版,内置了数百个Python经常会使用的库,也包括了许多机器学习和 ...

  2. Spring Conditional注解使用小结

    今天我们来总结下Conditional注解的使用. Conditional注解 增加配置类Config package condition; import org.springframework.co ...

  3. linux 硬盘满了如何处理

    事件源于在服务器运行一个脚本程序… 好好的脚本突然报错,还以为脚本出现问题了.细看报错原因(具体报错信息已经忘记了),是没有可用空间.从没遇见过这个情况,怎么办呢? 一.确定是不是真的是磁盘空间不足 ...

  4. 2017-11-8—自动控制原理在软硬件方面上的应用和体现

    这个话题讲起来是非常大的,先贴一下百度百科的定义: 自动控制(automatic control)是指在没有人直接参与的情况下,利用外加的设备或装置,使机器.设备或生产过程的某个工作状态或参数自动地按 ...

  5. Android中的Application类在应用程序中的应用

    Application类 每次应用程序运行时,应用程序的Application类都保持实例化状态(都会持有该Application实例).与Activity不同的是,配置改变并不会导致应用程序重启.在 ...

  6. 太原面经分享:如何用js实现返回斐波那契数列的第n个值的函数

    面试攒经验,let's go! 值此高考来临之际,闲不住的我又双叒叕出发去面试攒经验了,去了公司交待一番流程后,面试官甩给了我一张A4纸,上面写着一道js算法笔试题(一开始我并不知道这是在考察js算法 ...

  7. JPA(Hibernate)

    JPA 1,JPA:Java Persistence API.JPA通过JDK 5.0注解-关系表的映射关系,并将运行期的实体对象持久化到数据库中.JPA是JavaEE中的标准.JPA标准只提供了一套 ...

  8. java基础 第七章课后习题

    1.改正后的应该为: String [] scores= new String[5];    或者 String [] scores={ “ Mike”,"Lily" ," ...

  9. DevExpress控件GridControl中的布局详解 【转】

    DevExpress控件GridControl中的布局详解 [转] 2012-10-24 13:27:28|  分类: devexpress |  标签:devexpress  |举报|字号 订阅   ...

  10. map映射

    采集于:https://blog.csdn.net/luanpeng825485697/article/details/78056312 映射map: var map = new Map(); //映 ...