OO第二單元--多線程電梯

来源:https://www.cnblogs.com/llldy/archive/2020/04/18/12723596.html
-Advertisement-
Play Games

一、設計策略 (1)單電梯: a、線程分工: elevator、request兩個線程。 elevator線程主要負責乘客的接送和進出。 request線程是接收乘客信息。 control是緩衝器,用來保存elevator和request兩個線程共用的乘客隊列。 b、調度策略: 以電梯當前樓層和運行 ...


一、設計策略

(1)單電梯:

  a、線程分工:

    elevator、request兩個線程。

      elevator線程主要負責乘客的接送和進出。

      request線程是接收乘客信息。

    control是緩衝器,用來保存elevator和request兩個線程共用的乘客隊列。

  b、調度策略:

    以電梯當前樓層和運行狀態為基準,如果電梯是上行的,並且高於當前樓層還有乘客要進出就上行,否則判斷是否低於該樓層有需求,如果有就下行。反之亦然,若是沒有需求,則令電梯停止。對於乘客的調度則是到了規定樓層,能出則出,能進則進。

(2)多電梯1.0:

  a、線程分工:

    elevator類的五個電梯線程以及request線程。

    elevator線程主要負責乘客的接送和進出。

    request線程是接收乘客信息。

    control是緩衝器,用來保存elevator和request兩個線程共用的乘客隊列。

 

  b、調度策略:

    基於第一次作業的單電梯,將request中獲得的乘客,平分到每個電梯中。

(3)多電梯2.0:

  a、線程分工:

    elevator類的若幹個線程以及request線程。

    elevator線程主要負責乘客的接送和進出。

    request線程是接收乘客信息。

    control是緩衝器,用來保存elevator和request兩個線程共用的乘客隊列,以及保存電梯類的個數。

  b、調度策略:

    擴展PersonRequest類的功能,便於進行換乘操作。根據ABC不同的電梯停靠樓層對接收的乘客進行分類。能夠直達的儘量直達,若是出現都能直達的情況根據ABC的優先順序進行分類。若是不能直達的,則根據出發樓層ABC進行分類,換乘樓層集中在固定樓層1、5、15,便於進行操作,減少開關門的時間損失。對於同類別的不同電梯的乘客調度同第二次作業,對於電梯的運行同第一次作業。

二、第三次作業的可擴展性(SOLID原則)

(1)SRP(單一職責)原則

   request類主要進行生產者線程,elevator進行電梯的主要功能,control進行乘客信息的調度以及保存。三類的功能都不相同,符合單一職責的原則。在control中雖然有很多的方法,但是執行的目的都是十分簡單,還是符單一職責原則。

(2)OCP(開放封閉)原則

   因為沒有在寫作業時,沒有考慮代碼的可擴展性,很多方法在第三次多電梯的實現中,進行了些許的調整,如果該電梯還要進行一些擴展操作,我想對於這些方法還是應該要進行調整。因此我覺得第三次作業的OCP原則還是不是很好。

(3)LSP(替換)原則

   第三次作業中我單獨寫了三個電梯類,沒有歸類到一個父類裡面,因為在創建類,以及執行過程中都是用的電梯序號,所以沒有這方面的問題。

(4)ISP(介面隔離)原則

    對於不同電梯,通過電梯索引來對電梯進行操作,在後續的幾次拓展都得到一個很好的實現,所以相對來說介面隔離實現得比較好。但是對於電梯沒有通過屬性規範,而是獨立的建立了三個電梯類,我覺得這一方面的介面原則就處理得不是很好。

(5)DIP(依賴倒置)原則

   control緩衝區元素的建立依賴request的運行,elevator的執行和建立依賴control,沒有出現迴圈依賴的情況,還是很好的滿足了依賴倒置的情況。

三、度量分析

 

(1)第一次作業:

    UML

 

 

 

    複雜度分析

 

    a、dependency

 

 

 

 

    b、 complexity

 

    總結

 

     複雜度較好,但是對於control的setUpFloor方法的複雜度就比較高,這跟我的調度策略有著很大的關係,四次用到迴圈,結果作為條件的一種嵌套,都增加了複雜度,而這些在後續幾次作業都有體現。

 

(2)第二次作業:

    UML

    複雜度分析

    a、dependency

    b、 complexity

 

 

    總結

     這一次作業的的獨立性相對比較好,但是複雜度分析有很多的方法爆紅,特別是setUpFloor的方法,我想應該是在該方法有四個迴圈,導致該方法的複雜度很高,而且得出的結果又會用來下一次的判斷條件,所以有一個嵌套的複雜度,但是關於該方法的修正沒有比較好的想法。

(3)第三次作業:

    UML

 

 

 

    複雜度分析

    a、dependency

 

 

 

    b、 complexity

    總結

     這次作業的依賴性除了MainClass因為需要其他類來輔助執行,所以相對來說大一點其他還好。複雜度分析圖中,相比於第二次作業,爆紅的方法又加了一個addRequest方法,因為這次作業的調度設計涉及指定樓層,在沒有找到一個統一的方法的時候,只能通過打表的方式進行調度,我覺得或許可以通過將該函數進一步細化,得到一個複雜度較好的函數。

(4)plantMUL

 

 

 

四、bug分析

(1)自我bug分析

    互測測到的bug主要是錯誤使用了notify,隨機的喚醒線程使得我一些線程長睡不醒,改成notifyAll後就不會出現這樣的隨機性了。

   值得一提的是第三次作業的中測,由於對於notifyAll、wait的理解不夠深入,導致我在關於wait對象一判斷就喚醒,出現了一些線程wait條件判斷被阻塞,導致測試RE差點死於中測。但是經過這一次我好好學習了notifyAll的使用,發現只有在wait對象狀態發生改變的時候,即true變成false,才能夠notifyAll

(2)hack的bug

    第一次作業hack到的是暴力輪詢的bug;第二次作業沒有hack到;第三次作業hack到的是RE的bug,我覺得應該就是我中測碰到的那個類型的bug。

五、bug策略

   這次hack構造,主要從很長時間再來一個人hack暴力輪詢,通過一次來很多人hack調度分配線程衝突。但是碰到一些評測到無法復現的bug還是感到多線程就是運氣的問題,但是如果一個安全的程式不應該依賴於運氣,應該要有一個充分的維護。與第一單元相比,這一次的作業在調試,bug復現的難度上大大的提高,而且有時候原理搞不明白,也很難找到bug。所以我認為還是應該要細細的分析程式,通過自動測試的方式只能是一種手段,還應該從從線程的程度上考慮,避免阻塞的情況發生。

六、心得體會

   在這一次作業中,從線程安全上考慮應該要理清楚線程的執行順序,線程共用的對象。設計原則上應該儘可能的符合開閉原則,減少一些重覆操作和閉合操作,防止死鎖的產生。多線程的體驗中,我學習到了一些設計模式,雖然理解還不是很透,但是對於多線程的協作感到十分的神奇,而且感覺十分的接近現實生活。而且感覺學習寫程式,不應該依賴於專有的設計架構,應該多想想多嘗試一些原理。不然再後續調bug,可能自己就算是小黃鴨講解程式,也還是不會找到程式的bug。同時這種多線程的使用,在過程式代碼中是相當難實現得,又進一步瞭解了面向對象程式!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天升級了vue cli,發現在使用vuecli4創建項目後eslint找不到需要關閉的方式,經過一番嘗試和查找資料發現了兩種方式進行關閉; 第一:簡單粗暴。將package.jsonl裡邊所有的eslint刪除,然後重啟就行了; 第二: 在第一種的方式上有個問題就是如果後期需要添加eslint校驗 ...
  • 使用div元素製作一個三角形: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> ...
  • 學習一個新東西的時候,先要把開發環境搭起來,最近想學學前端技術,vue的開發環境搭建還是比較簡單,這裡簡單記錄一下 ...
  • 渣渣渣的筆記。。。。 開始也是用vue自定義指令來實現,後來發現一個頁面中有兩個el-dialog時,只有一個起作用,求指點。。。 所以寫了一個全局的方法來調用。 ~/utils/dialogDrag.js 1 export default { 2 dialogDrag(el) { 3 let dr ...
  • 居中:盒子在其包含塊中居中 1.行盒(行塊盒)水平居中: 直接設置行盒(行塊盒)父元素的text-align屬性:center 2.常規流塊盒水平居中: 定寬,設置左右margin為auto; div{ width:100px; margin:0 auto; } 3.絕對定位的水平居中: 定寬,設置 ...
  • 北冥複習html(一) 一、基本結構 <!DOCTYPE html> <html> <head> <title>網頁標題</title> <meta charset="utf-8"/> </head> <body> </body> </html> 二、什麼是HTML? HTML指的是超文本標記語言( ...
  • 這是一篇來自前端大牛前輩的學習心德,好好看哦~其實本文可以說是“起於前端,但不止於前端。”希望能夠給同行一些可行性的建議吧。 “能度一人是一人吧!” 1、Github,Github,Github 重要的事情所以說三遍。如今前端圈大熱,除了前端項目天生開源的優勢之外,Github這個網站功不可沒。可以 ...
  • 1.行盒內容垂直方向對齊: 在行盒元素上使用vertical-align:bottom/middle/top 或者像素值 2.圖片的底部白邊問題: 圖片的父元素是一個塊盒,塊盒高度自動,圖片底部和父元素底部之間往往會出現空白 如下圖所示: 解決方法: 1.設置父元素的字體大小為0,font-size ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...