第五次作业——多线程电梯
作业概述:第五次作业是在第三次作业的基本上增加多线程的概念,说起来好像挺容易的,但其实真正做起来花费了很多时间,最先开始,我对于多线程的印象只有老师在课堂上讲的概念和简单的例子,所以要上网查找很多关于多线程的知识,然后从简单的实例锻炼开始学习。因为我第三次的电梯事实上是脑补实际情况再执行的,所以多线程的电梯需要重新构造,然后就从输入开始写,实现调度器,电梯,主函数,结束线程,将结果输入到文件中一步步实现功能,最后完成程序。真的是一个很漫长的过程,周一晚上才发现之前写的都不能用,真的很绝望,好在最后还是写出来了。
各类大致说明:
Controller 类:调度器类,不断扫描请求队列,按照规定的调度方法将不同的指令分配给合适的电梯。
Elevator 类:第二次作业的电梯。
Floor 类:用于提供整个程序所需要使用的多种结构体
Queue 类:Floor结构的可变数组,用于完成队列增删、get、set等工作。
Request类:用于判断输入的字符串是否合法并返回一个值。
ALS类:构造了一个有当前可捎带队列和主请求的结构。
Scheduler类:第三次作业的电梯类,继承Elevator类,但新生成了一个捎带函数用来完成电梯在捎带过程的工作。
Interface类:抽象接口,归纳Elevator的所有方法。
MainClass类:主类,用于开启和关闭调度器线程和三个电梯线程,并不断读入指令。
Scheduler_new 类:继承第三次作业的电梯,独立的电梯线程,不断刷新判断当前电梯线程有没有被摊派的任务,依照捎带原理,不断地执行已摊派任务,并不断更新当前状态,方便调度器将新的指令分给该电梯线程。
作业类图:
优点:
可以自行安全的结束线程,算法不会出现计算误差,电梯类,调度器类的分工比较合理。
缺点:
表面上继承了之前的电梯类,其实全部重写的,其实没有存在的意义,还有即时重写也没有发现Floor类的真实用处,还是用它完成了指令的结构体。
我的bug
写了很久的作业,虽然感觉可能存在不安全的线程行为,但是并没有被找到bug,而且readme其实有没有写清楚的部分,也没有被扣分,感激!!!
别人的bug
作业代码没有认真看,readme写的超级诚恳,虽然不让立即我输入END(一定要执行完毕这样子),还告诉我会对CPU不友好哈哈哈,公测发现在楼层是0时会出现crash,可能是正则表达式没有筛除吧(有点粗心),还有可能是算法的问题,在执行请求条数比较多时,会出现输出时间有误差的情况。互测发现不输入字符直接回车会有crash的问题(应该还是正则的问题),其实是复制请求不小心复制了一行空的无意发现的,还有就是对于捎带问题的判断存在问题。多线程大家都很不容易,所以后面就没找了。
第六次作业——IFTTT
作业概述:第六次作业是要对线程安全的概念理解运用,完成一个IFTTT系统。在写程序之前,我并没有听说IFTTT的威力,然后刚刚完成多线程的电梯,就没有在周末早早开始阅读指导书,只抽出了周日晚上的时间来阅读指导书。看完了,然后在纸上写了应该怎样分成各个类以及每个类的功能,美美睡了一觉。第二天起来,开始写,写到一半,和室友交流以及看issue和微信群的助教回答,发现自己理解错了,推翻架构重新来。虽然说算法并不是很困难的,但是出现了bug很难修复,为了一个bug找好几个小时都是有可能的,最后终于完成了一个能进行基本功能的程序,边界情况就没有考虑了,简直是身心俱疲。
各类大致说明:
Input 类:输入监控请求类,进行格式检测和数量监测等功能,同时将合法的监控请求加入队列中。
struct 类:用于提供监控请求的结构体。
Messege类:用于提供要输出的detail和summary。
Safefile类:线程安全类,用于安全的实现对于文件的各种操作。
Monitor类:监控线程,用于不断扫描目录树,然后进行触发等任务。
Implemnts类:抽象接口,归纳线程安全类的所有方法。
MainClass类:主类,用于开启和关闭测试线程和监控线程,并不断读入指令。
作业类图:
优点:
可以自行安全的结束线程,类的分工比较合理。
缺点:
线程的创建划分不合理,会出现多线程造成的错误。
我的bug
没有在监控对象是目录时,如果删除文件夹,忘记将代码改成可以响应x bytes-> 0 byte的size_changed触发器,和readme不符。然后是如果新建了目录忘记将新建的目录加入我的目录树中。
别人的bug
这次分到的是一份完成的很好的作业,学习了一波~
第七次作业——第一次出租车
作业概述:第六次作业是要完成模拟出租车的乘客呼叫与应答系统。根据课上的PPT先进行了一下需求分析,大致分了几个类,以及各自需要具有的属性和要实现的功能,结果发现实现起来并没有分析起来的那么简单,然后改动一下各类,基本上可以实现出租车的行驶,但是,因为这周其他的工作以及真的不是很知道怎么测自己的bug就没有很认真debug.
各类大致说明:
Input 类:从文本文件中读入地图,进行格式检测等功能,同时将获得的地图传给gui生成,并且进行一些初始化的工作。
queuestruct 类:用于提供乘客请求的结构体。
Queuestruct类:用于提供乘客请求队列。
Gui类:课程组提供的一些方法和gui图形界面的生成。
request类:用于对输入的请求进行格式判断。
Safefile类:线程安全类,用于安全的实现对于文件的各种操作。
Controller类:调度器类,不断扫描请求队列,根据一定的规则为合适的出租车派发任务。
Implemnts类:抽象接口,归纳线程安全类的所有方法。
Strcut类:地图类,对文件读入的内容进行一些基本判断和操作。
Taxi类:出租车类,用于实现出租车在各个状态之间的变化以及行驶。
MainClass类:主类,用于开启调度器线程和出租车线程,并不断读入指令。
作业类图:
优点:
可以自行安全的结束线程,类的分工比较合理。
缺点:
忘记使用线程安全的文件操作类,可能会造成不安全的后果。
我的bug
没看清指导书,将信用值+1理解为是对接到单的出租车而言,其实是对于所有参与抢单的出租车而言的,本人真滴是超级无敌粗心了,但是感谢测试的小可爱,只给我报了imcomplete。
别人的bug
应该是很大佬了,有五个文件包……拿到时我这个菜鸡就觉得不想测了,结果发现大佬没有考虑请求起止位置坐标的范围,公测竟然跪了orz,然后就为了快乐五一,又学习了一波~
心得体会
第三次作业都是多线程的,多线程的程序要求我们注意线程安全,这样才能保证执行时不会出现一些奇奇怪怪的问题。通过这几次的作业,通过对分析原则的学习,也尝试着将一些比较冗杂的方法拆解得比较简单。使得修改时不需要花费很多时间,只需要对专门的子方法进行修改就好。在编写程序前,我们需要对自己所写的程序有一个总体的大局观,构建属于自己的结构框架,然后在之后的时间中,不断地丰富内容,实现程序功能。就像绘画一样,需要先勾出底稿,然后用色彩丰富画稿。