电梯系列第一次作业

功能描述:

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

线程模式:

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. Codeforces Round #524 (Div. 2) F

    题解: 首先这个东西因为强制在线区间查询 所以外面得套线段树了 然后考虑几条线段怎么判定 我们只需要按照右端点排序,然后查询的时候查找最右节点的前缀最大值就可以了 然后怎么合并子区间信息呢 (刚开始我 ...

  2. Berlekamp_Massey 算法 (BM算法) 学习笔记

    原文链接www.cnblogs.com/zhouzhendong/p/Berlekamp-Massey.html 前言 BM算法用于求解常系数线性递推式. 它可以在 $O(n^2)$ 的时间复杂度内解 ...

  3. UOJ#460. 新年的拯救计划 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ460.html 题解 本题的构造方法很多.这里只介绍一种. 首先,总边数为 $\frac{n(n-1)}2 ...

  4. hdu5707-Combine String(DP)

    Problem Description Given three strings a, b and c , your mission is to check whether c is the combi ...

  5. Kali Linux常用服务配置教程启动DHCP服务

    Kali Linux常用服务配置教程启动DHCP服务 通过前面的介绍,DHCP服务就配置好了.接下来,用户就可以使用该服务器来获取IP地址了.下面将对前面配置的服务进行测试. 1.启动DHCP服务 如 ...

  6. BZOJ.3566.[SHOI2014]概率充电器(概率DP 树形DP)

    BZOJ 洛谷 这里写的不错,虽然基本还是自己看转移... 每个点的贡献都是\(1\),所以直接求每个点通电的概率\(F_i\),答案就是\(\sum F_i\). 把\(F_x\)分成:父节点通电给 ...

  7. Django 启动源码

    handler = self.get_handler(*args, **options) run(self.addr, int(self.port), handler,ipv6=self.use_ip ...

  8. In the beginning, Coders create the repos and blogs

    ---恢复内容开始--- 这是一个新的博客 print(‘hello new world’) 这个博客叫做 brain in a jar, 不知道以后会不会改名. 只是因为偶然想到了普特南的缸中之脑理 ...

  9. 2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017)

    A. Alien Sunset 暴力枚举答案即可. #include<cstdio> int n,i,mx; struct P{ int h,r,t; bool night(int x){ ...

  10. LOJ #6303. 水题 (约数 质因数)

    #6303. 水题 内存限制 10 MiB 时间限制:1000 ms 标准输入输出 题目描述 给定正整数 n,kn, kn,k,已知非负整数 xxx 满足 n!modkx=0,求 xmaxx_{max ...