其他分享
首页 > 其他分享> > OO第二单元总结 —— 多线程电梯调度

OO第二单元总结 —— 多线程电梯调度

作者:互联网

OO第二单元总结 —— 多线程电梯调度


一、设计分析


1. 整体设计

在本单元的三次作业中,使用了两级调度器进行调度,整体架构基本相同,大致如下图所示:

其中Scheduler为一级调度器,设置为一个独立的线程,负责将读入的请求发送给各个电梯线程。而Dispatcher为第二级调度器,没有设置为独立线程,而是包含在电梯线程内部,负责控制电梯的行为,处理请求。

2. 调度器设计与同步块设计

3. 架构设计

二、BUG分析


1. 逻辑错误

因为从设计到编写的全过程完全是从模拟的角度出发,而非算法设计,因而很少出现逻辑错误,但在第七次作业时还是因为粗心而出错。

在处理换乘时,选择使用类似链表的形式处理,本应在前一程完成后逐个唤醒,但在最初时却错误地将后续结点全部唤醒。

public synchronized void personArrive() {
	arrived = true;
    if (nextTerm != null) {
        nextTerm.personArrive();
    }
	Scheduler.arouseElevators();
}

修改之后的代码见上

2. 多线程问题

由于在此单元之前未曾真正意义上接触过多线程编程,因而在这一过程中走了许多弯路。

3. 发现BUG的方法

本单元主要依靠直接阅读源代码来寻找BUG,在发现BUG后通过打印运行过程信息进行定位。

这种方法效率较低,但也有一定实效,在互测时凭借自己的经验(踩过的坑)发现了一些线程安全问题,但始终也没能复现

与上一单元最大的不同或许就是占据了主要地位的线程安全问题并不是一定能通过测试找到,即使找到也有很大概率无法复现。

三、心得体会


更多的也已经包含在上面的内容里了,也就不再重复了~

感谢大家的帮助,也祝大家接下来的两个单元都能一帆风顺~

2021年4月23日

标签:OO,请求,synchronized,requestQueue,调度,电梯,线程,多线程
来源: https://www.cnblogs.com/hecate/p/14696097.html