电梯系列第一次作业

功能描述:

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

线程模式:

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. (四)Knockout 表单

    click <div> You've clicked <span data-bind="text: numberOfClicks"></span> ...

  2. 14.并发与异步 - 1.线程处理Thread -《果壳中的c#》

    14.2.1 创建一个线程 实例化一个Thread对象,然后调用它的Start方法,就可以创建和启动一个新的线程.最简单的Thread构造方法是接受一个ThreadStart代理:一个无参方法,表示执 ...

  3. C++线程中的几种锁

    线程之间的锁有:互斥锁.条件锁.自旋锁.读写锁.递归锁.一般而言,锁的功能越强大,性能就会越低. 1.互斥锁 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量.也就是说是为了避免多个线程在 ...

  4. Apache为mysql以及自己的项目设置虚拟路径

    参考 http://www.120xcjl.com  Apache为mysql以及自己的项目设置虚拟路径 1.Apache2.2\conf\httpd.conf中释放: Include conf/ex ...

  5. Intervals 差分约束

    题意:给定n个区间[Li,Ri]以及n个整数vi. 现在要有一个集合,使得这个集合和任意[Li,Ri]都有 至少 vi个元素相同. 问这个集合最少要几个元素. 定义S(x) 表示[1,x]中选择的元素 ...

  6. vue.cli脚手架初次使用图文教程

    vue-cli作用 vue-cli作为vue的脚手架,可以帮助我们在实际开发中自动生成vue.js的模板工程. vue-cli使用 !!前提:需要vue和webpack 安装全局vue-cli npm ...

  7. BZOJ.2823.[AHOI2012]信号塔(最小圆覆盖 随机增量法)

    BZOJ 洛谷 一个经典的随机增量法,具体可以看这里,只记一下大体流程. 一个定理:如果一个点\(p\)不在点集\(S\)的最小覆盖圆内,那么它一定在\(S\bigcup p\)的最小覆盖圆上. 所以 ...

  8. 图论算法之DFS与BFS

    概述(总) DFS是算法中图论部分中最基本的算法之一.对于算法入门者而言,这是一个必须掌握的基本算法.它的算法思想可以运用在很多地方,利用它可以解决很多实际问题,但是深入掌握其原理是我们灵活运用它的关 ...

  9. Django——发送邮件

    Django--发送邮件 在web应用中,服务器对客户发送邮件来通知用户一些信息,可以使用邮件来实现. Django中提供了邮件接口,使我们可以快捷的建设一个邮件发送系统. 以下是一个简单实例: se ...

  10. XVII Open Cup named after E.V. Pankratiev. GP of Tatarstan

    A. Arithmetic Derivative 形如$p^p(p是质数)$的数的比值为$1$,用$k$个这种数相乘得到的数的比值为$k$,爆搜即可. #include<cstdio> # ...