(1) 從多線程的協同和同步控制方面,分析和總結三次做業的設計策略。安全
第一次做業:傻瓜電梯;按照先來先服務的原則,沒有考慮捎帶的狀況,實現起來較簡單,主要是兩個線程和一個請求隊列,一個輸入線程,一個電梯線程;請求隊列能夠當作在電梯內;輸入線程將請求送進請求隊列中,電梯線程不斷從請求隊列中取請求,二者用synchronized互斥,根據請求運行,若請求隊列爲空,則wait直到有新的輸入請求送進請求隊列中;輸入終止標誌則是以輸入請求0-FROM-0-TO-0爲標記,讀到此請求即break循環。多線程
第二次做業:ALS(可捎帶電梯);捎帶與一些主請求運行方向相同的請求,但此次做業,忽略了一個重要的方面(當主請求未在電梯中,上下樓層去接主請求時,電梯一味的向上或向下運行,忽略了能夠接人),致使運行時間很是的長。和第一次做業同樣,主要是兩個線程(一個輸入線程,一個電梯線程),一個請求隊列,一個捎帶隊列和一個主請求;此次請求隊列和捎帶隊列在輸入線程和電梯線程中充當緩衝區的做用;輸入線程將請求送進請求隊列中;電梯線程每運行到一層,先判斷是否更新主請求,根據主請求,判斷請求隊列裏面是否有可捎帶的,有捎帶的話就將該請求加入捎帶隊列,而後判斷捎帶隊列裏面是否有在該樓層in或out的請求,判斷是否在該樓層停靠,停靠必定時間再更新捎帶隊列,判斷是否在樓層停靠期間有新的請求加入(以該樓層爲起點的請求);輸入終止標誌則是以輸入請求0-FROM-0-TO-0爲標記,讀到此請求而且捎帶隊列和請求隊列裏面沒有請求的話就break循環。此次做業只用到一個對象鎖,即請求隊列的對象鎖,保證輸入線程送進請求進請求隊列,電梯線程判斷是否請求隊列中有捎帶請求互斥以及當捎帶隊列裏面無任何請求時wait請求隊列的更新。架構
第三次做業:多部多線程可捎帶電梯;此次做業經過第二次做業互測環節閱讀他人代碼吸收了其餘人設計的優秀之處,使得代碼架構獲得了優化。此次做業用了四個線程(三個電梯線程,一個輸入線程,三個電梯線程用了同一個類),三個請求隊列和三個捎帶隊列(每一部電梯有一個請求隊列和捎帶隊列);請求隊列和捎帶隊列在輸入線程和電梯線程中仍然充當緩衝區的做用;輸入線程在輸入請求時判斷請求需不須要換乘,提早換乘,而後再將請求給送進相應的請求隊列,即提早指定請求須要乘坐的電梯,這是一個可優化點,但沒有想到好的架構;相應的電梯線程就根據請求隊列運行,須要判斷請求結束後是否有換乘,將換乘請求送進相應的請求隊列,此次做業與第二次做業思路基本一致但將第二次做業可捎帶電梯中被忽略的點給優化了(實現了當主請求未在電梯中,上下樓層去接主請求時,電梯能夠捎帶接人);此次的結束標記也添加了電梯是否還有換乘請求須要送進請求,沒有換乘請求才能結束(加入一個換乘請求的計數,每當輸入請求有換乘即加一,每當將換乘請求加入相應的請求隊列中即減一);此次用到了四個對象鎖,三個請求隊列鎖,與第二次做業做用一致,一個object鎖,用於實現輸出的互斥。單元測試
(2) 基於度量來分析本身的程序結構。測試
第一次電梯做業:類圖:優化
方法以及類的複雜度:spa
第一次做業方法和類複雜度較低,類與類之間聯繫也較小。線程
第二次電梯做業:類圖:設計
方法以及類的複雜度:3d
第二次做業電梯運行與電梯運行時須要獲得請求這兩個方法複雜度較高,也致使了電梯類與請求類的循環複雜度較高。
第三次電梯做業:類圖:
方法以及類的複雜度:
第三次做業電梯運行與提早判斷請求是否換乘,獲得相應的乘坐電梯序列這些方法複雜度較高,致使了電梯類與judge類的循環複雜度較高。
優勢:三部電梯均爲ALS電梯,電梯與電梯之間耦合性小,優化了第二次做業,實現了當主請求未在電梯中,上下樓層去接主請求時,電梯也能夠捎帶接人。
缺點:提早指定相應的電梯,若電梯滿員只能等待,未能和電梯線程進行交互,未能作到電梯搶奪請求,而是請求送往電梯;可擴展性不強,當有電梯須要中止運行時,架構須要較大的改變;電梯線程和請求隊列之間耦合性大;以及第三次做業有些方法和類的複雜度太大。
(3) 分析本身程序的bug,分析未經過的公測用例和被互測發現的bug。
在本身找bug階段,第二次做業主要是架構未想好就上手寫,本身的架構改了又改;第三次做業bug主要存在與電梯線程終止的判斷中,須要考慮到換乘請求。
在公測和互測中均未被發現bug。
(4) 分析本身發現別人程序bug所採用的策略
以第三次做業爲例,首先對多電梯樓層間運行時間,開關門時間和電梯容量等進行測試,而後構造一些特殊的須要換乘的請求對別人代碼進行測試;還有就是閱讀他人代碼,根據對共享資源的操做,判斷線程的安全性,也能學到新的知識。本單元與第一單元測試策略的差別之處在於此次是多線程做業,因此線程安全是一個很是重要的,檢測bug的點。
(5) 心得體會從線程安全和設計原則兩個方面來梳理本身在本單元三次做業中得到的心得體會。
經過這三次做業,學到了不少關於多線程的知識,從徹底沒有多線程的概念,到可以設計出多線程ALS電梯;同時學會了synchronized這一鎖機制,可以較靈活的應用,在這三次做業中,除了開關門,電梯在樓層中運行這些是固定時間,須要用到sleep外,其餘都是經過notidyAll與wait來實現的;當多個線程對共享資源進行操做時,須要實現互斥,不然線程不安全;同時,在程序可以過中測後,也養成了一個習慣,對代碼再次進行分析,判斷線程是否安全,可否找到本身的bug.