本单元从电梯调度相关问题层层深入,带领我们学习并运用了了多线程相关的知识。

三次电梯调度依次为单电梯单容量、单电梯可携带、多电梯可携带。

一.我的设计

在第一次作业中,使用了最简单的FIFO调度方法。设计思路大体如下:设计一个容器,在读入到新乘客请求时将之放入容器尾,容器非空时,电梯线程将在自己处于非载客状态时取出容器首元素进行工作,完成此次工作后,检查容器,非空继续工作,否则wait直到容器获得新乘客唤醒电梯或者输入结束从而结束线程。

在第二次作业中,一共有两个线程,分别为电梯线程与乘客申请线程(实际上就是读取输入的线程),在这里被轮询问题卡住过。我的设计思路整体与上一次相似,知识对于电梯的调度策略上,采用了指导书的方法,如果电梯内队列非空,优先处理电梯内第一个乘客的请求,否则载入在外面等待最久的乘客,在运行过程中如果有乘客可以进或者出则放行。这里只需要在没有当前读入且没有待处理的乘客时wait,有新读入时notify即可。

第三次作业中在复用第二次代码的基础上,将电梯线程扩展为了每个电梯一个线程,并进行了一些线程安全的考虑,遗憾的是最终因为轮询问题没能得到完全解决而没有得到好成绩。主要问题出现在本次代码的解决轮询机制最开始是复用了第二次的,但是会出现有的电梯尚在工作却被wait的情况,后来该换成了分别根据第二次的判定内容wait,但在强侧中好像有bug,另外我的调度算法大致思想是在必须换乘的乘客,先找到最近的换乘楼层然后安排电梯接送,但是在优化过程中似乎会有时间差问题使得当乘客换乘后原本准备接他的电梯已经离开而该乘客也没有回到等待队列从而出现bug。

二.bug与修复

前两次没有大问题,主要是算法完全按照指导书写性能不是很高,第三次因为前面提到的问题导致CPU时间炸了。

三.心得与体会

线程交互与安全如何兼得以及CPU时间保证(解决轮询)还需多加学习。

最新文章

  1. js中快速获取数组中的最大值最小值
  2. MyEclipse安装lombok
  3. word2013 blog test
  4. RelativeLayout_布局
  5. codeforces 671B Robin Hood 二分
  6. 简单的网页采集程序(ASP.NET MVC4)
  7. Jquery小东西收集
  8. Logger之Logger.getLogger(CLass)
  9. Python+selenium打开网页
  10. SPCircleView的使用(圆心向四周扩散动画)
  11. 集群通信组件tribes之使用方法
  12. XBanner的简单使用轮播
  13. BZOJ4541 HNOI2016矿区(平面图转对偶图)
  14. windows端口占用情况
  15. 在Plesk安装PHP的Memcached扩展
  16. 《Go语言实战》摘录:7.2 并发模式 - pool
  17. java FileReader/FileWriter读写文件
  18. java(9)并发编程
  19. @log的decorator完美实现(原创)
  20. BZOJ 1875 【SDOI2009】 HH去散步

热门文章

  1. 模拟BS服务器
  2. LVS负载均衡集群--NAT模式部署
  3. spark相关介绍-提取hive表(一)
  4. 每日学习——iframe标签伪造ajax
  5. 【C++基础教程】第三课
  6. PHP的Mcrypt加密扩展知识了解
  7. Jmeter系列(25)- 常用逻辑控制器 (4) | Include控制器Include Controller
  8. Django边学边记—新手Django建项目各流程细节
  9. english note(6.17to6.23)
  10. Python自动化测试发送邮件太麻烦?!一起聊一聊 Python 发送邮件的3种方式