301
社区成员
发帖
与我相关
我的任务
分享此篇主要围绕hw5和hw6。


hw5和hw6的架构主要参考了实验的代码架构,采用生产者-消费者模式,总共分为3类线程:输入线程,调度器和电梯线程,线程之间通过队列等共享空间传输信息。
主要流程:输入线程读取每个请求,并实例化加入总的请求等待队列;而调度器从这个队列中取一个请求,并按要求中指定的电梯或是自行按顺序分配给指定电梯线程自己的等待队列;电梯线程获取一个请求,将其视为主请求,进行一系列的运行,将请求送达。
hw5的调度器实际上没有实质性上的调度,即从总队列中读取一个请求,并按请求分配给指定电梯线程的等待队列。
对于hw6的调度器(主要):
首先还是从总队列中读取一个请求,然后根据请求是乘客请求还是重置请求,分别处理。
重置请求的话,会按重置请求分配给指定电梯的重置队列。
乘客请求的话,针对于互测时会出现同一时间输入很多请求的情况,前四五十个请求会依次分配给每部电梯线程等待队列,之后通过电梯的状态线程获取电梯的最新状态,将请求分配给能捎带的电梯线程等待队列。
hw6中调度器线程和每部电梯线程之间共享电梯的乘客请求等待队列、重置请求等待队列、电梯状态队列。
先平均分配再根据电梯状态分配的调度策略在hw6中强测和互测中都没有什么大问题,相较于影子电梯或是打分,性能上肯定还是差一点。
我在共享队列的每个读写方法都加了synchronized确保线程安全。


hw5有效代码行数为401行。

hw6有效代码行数为801行。
主要通过prinIn观察代码的执行情况。
出现过的bug挺多,多为代码逻辑执行的顺序错误,线程不结束等。
调度bug:同一时间输入大量请求,调度器来不及获取到最新的电梯状态,从而将大量的请求分配给一部电梯。
hw7差在双轿厢不碰撞没有完成。
改动的地方主要是:
第二单元作业相较于第一单元作业更容易上手,但在实现电梯的运行策略、调度策略等时,还是有很多细节需要注意的。
总的来说,除了hw7因为时间分配的问题,还差一点最终没能完成,有点可惜。除此之外,第二单元的整个学习过程还是满意的。