OO第二单元总结
前言
本单元基于多线程程序相关内容,模拟多线程实时电梯系统,熟悉线程的创建、运行等基本操作,熟悉多线程程序的设计方法。
多线程:通过加锁和解锁,使临界区最多执行一个线程
关键字 synchronized 实现加锁:用其将托盘类设置为线程安全类
方法 wait() 释放锁
方法 notify() 释放锁并唤醒线程
架构:使用生产者消费者模式,输入线程作生产者,电梯线程作消费者,中间托盘缓存数据
调度策略:使用自由竞争策略/构建调度器
捎带策略:可使用ALS、LOOK等经典算法,也可自己构造算法(如贪心算法)。
第五次作业
作业要求:
系统基于一个类似北京航空航天大学新主楼的大楼,电梯可以在楼座内 1−11 层之间运行,从标准输入中输入请求信息,程序模拟电梯运行,将运行信息通过输出接口进行输出。 本次作业电梯系统具有的功能为:上下行,开关门,模拟乘客的进出。
难点分析:
调度和算法:
ALS策略:
主请求+被捎带请求
主请求:
电梯中有乘客 ?
到达时间最早的乘客请求作主请求 :
请求队列中到达时间最早的请求作主请求。
被捎带请求:
电梯的主请求存在&&该请求到达请求队列的时间<=电梯到达该请求出发楼层关门的截止时间&&电梯的运行方向和该请求的目标方向一致。
避免轮询和死锁
时序图:
架构(类图):
第六次作业
作业要求:
在第一次作业的基础上,掌握线程安全知识并解决线程安全问题,同时在架构上围绕线程之间的协同设计层次架构。
新增部分:
模拟电梯系统扩建和日常维护时乘客的调度
扩建:
即新建一部电梯放入电梯类,而电梯类也应该是table,是共享资源。
维护:
主要考虑乘客退出当前电梯,重新进入请求队列的实现。
难点分析:
电梯类是共享资源,需要注意保证线程安全
注意 如果读取到maintain指令应该尽快维修,而维修结束应该添加为线程的必要条件
第七次作业
作业要求:
在前两次作业的基础上,掌握线程之间的交互,强化线程之间的协同设计层次架构
新增部分:
信号量的使用:
Semaphore关键字
acquire()方法:获取信号量许可
release()方法:释放信号量许可
调度器的添加
路径算法
心得体会
本单元作业基于多线程设计进行电梯模拟,因此调试会很困难,定位bug比较麻烦。但是基于第一单元训练,代码架构的层次化特征比较清晰,更加符合面向对象的特点。
CSDN-Ada助手: 不知道 Python入门 技能树是否可以帮到你:https://edu.csdn.net/skill/python?utm_source=AI_act_python
CSDN-Ada助手: 非常感谢您的分享!多线程程序设计是一个非常重要的领域,看到您能够熟练掌握多线程的创建、运行等基本操作,以及加锁、解锁等关键步骤,我深感敬佩。同时,您提到的生产者消费者模式和调度策略也是非常实用的技能。 除此之外,关于多线程程序的优化也是一个非常值得探究的领域,比如使用线程池、避免死锁等等。希望您能够继续学习和探索,不断提升自己的技能水平。期待您的下一篇博客! 如何写出更高质量的博客,请看该博主的分享:https://blog.csdn.net/lmy_520/article/details/128686434?utm_source=csdn_ai_ada_blog_reply2 如果您持续创作,完成第三篇博客,并且质量分达到 80 分以上,在评论区就有机会获得红包奖励哦!
CSDN-Ada助手: 恭喜您写了第三篇博客,总结了OO的第三单元,看来您对这个话题有深入的了解。希望您能够继续保持创作的热情,分享更多有价值的知识给读者。建议您在下一步的创作中可以尝试探讨一下OO的实际应用场景,让读者更加深入地理解和应用该知识点。再次恭喜您,期待您的下一篇文章! CSDN 正在通过评论红包奖励优秀博客,请看红包流:https://bbs.csdn.net/?type=4&header=0&utm_source=csdn_ai_ada_blog_reply3,我们会奖励持续创作和学习的博主,请看:https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply3
CSDN-Ada助手: 算法 技能树或许可以帮到你:https://edu.csdn.net/skill/algorithm?utm_source=AI_act_algorithm
CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天最佳新人】榜单,全部的排名请看 https://bbs.csdn.net/topics/614136979。