OO第二次博客作業——電梯調度

来源:https://www.cnblogs.com/kidogu/archive/2019/04/22/10753186.html
-Advertisement-
Play Games

OO第二次博客作業——電梯調度 前言 最近三周,OO課程進入多線程學習階段,主要通過三次電梯調度作業來學習。從單部電梯的傻瓜式調度到有性能要求的調度到多部電梯的調度,難度逐漸提升,對同學們的要求逐漸變高,我們對線程的理解也逐漸加深。下麵筆者將對三次作業分別進行總結。 一、單部多線程傻瓜調度(FAFS ...


 

OO第二次博客作業——電梯調度

前言

最近三周,OO課程進入多線程學習階段,主要通過三次電梯調度作業來學習。從單部電梯的傻瓜式調度到有性能要求的調度到多部電梯的調度,難度逐漸提升,對同學們的要求逐漸變高,我們對線程的理解也逐漸加深。下麵筆者將對三次作業分別進行總結。

一、單部多線程傻瓜調度(FAFS)電梯

說明:本次作業需要模擬一個多線程實時電梯系統,從標準輸入中輸入請求信息,程式進行接收和處理,模擬電梯運行,將必要的運行信息通過輸出介面進行輸出。本次作業對性能要求非常寬鬆,不需要進行優化處理。

  

構思:由於不考慮性能,在Main中每收到一個輸入,新開啟一個Request線程,Request線程調用電梯類Elevator的work方法。其中work方法是synchronized的方法,所以一個請求未處理完前其他請求被阻塞。

程式複雜度:

由於演算法簡單,複雜度較低。

程式依賴:

在依賴上表現良好。

 

評價:線上程安全性上很完美,並且完成了所有功能,沒有bug。缺點在於性能不夠優秀XD。這次作業算是多線程的一次小練手,熟悉了多線程編程方法。

 

二、單部多線程可捎帶調度(ALS)電梯

說明:本次對電梯性能有一定要求,需要我們自行設計演算法或使用A Little Smart演算法。

構思:考慮到對性能的要求,使用的是類Look演算法。具體而言,電梯掃描同一方向的請求至無同向,然後反向。根據這一思路,設計了5個類。Main創建Controller和Elevator兩個線程。Controller負責接收輸入,並向RequestList中存入請求。Elevator掃描RequestList並取出請求。

 

程式複雜度:

平均複雜度尚可,在電梯類中有少數方法複雜度稍高。主要是遍歷請求列表和while迴圈電梯上下運行導致的,不可避免。

依賴:

代碼行數:

 

評價:在強測中出現了一個bug:同時間輸入大量請求,而調度器未能全部同時接受導致超時。分析:電梯上下樓、開關門時白白占用RequestList的鎖,應該讓調度器繼續運作。調整了鎖的分配,如關門時讓電梯wait一定時間,此時調度器可以占用鎖。

總結:由於對鎖的分配沒有思考到位,沒有最大化優化臨界資源使用率,導致在極端情況下性能出現問題。

 

三、多部多線程智能(SS)調度電梯

說明:本次作業有多部電梯,對性能要求放鬆了,將重點放線上程安全和同步的設計上,在於最大限度降低耦合,每個對象只應該管自己該管的事。

構思:延續上次作業的思路,對每個電梯分配一個請求隊列,調度器可以觀察3個請求隊列,並選擇性寫入。電梯在乘客換乘時調用調度器進行添加請求。這樣一來,就最大限度地降低了耦合。只有請求隊列是共用資源,容易處理線程的同步。

類圖:

 

 複雜度:

在遍歷請求列表時複雜度變大,總體較好。

依賴:

Controller與Elevator共用請求隊列。

行數:

評價:

強測出現bug,發生了死鎖。排查後發現問題在於在添加請求這一方法上偶然出現互相持有資源導致。調整synchronized的範圍,使死鎖的必要條件消失(請求資源前放棄資源)解決了bug。

總結:

在設計程式時沒有預防死鎖這一bug的出現,說明對線程同步的考慮仍然不夠周到。然而失敗是最好的老師,在這一次作業完成後,認識到構思程式時,應更加謹慎、全面地考慮線程安全問題。

 

Bug攻防

採用測評機發現bug,在最後一次閱讀代碼發現了bug。

 

心得體會

(1)保證線程安全。

  做好資源的分配,尤其是預防死鎖的出現。

(2)集中化數據管理。

  將一組單獨寫成一個類便於管理,例如電梯的狀態。

(3)在底層類實現方法,提供介面,頂層類直接調用,讓自己的代碼更有層次感、


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

-Advertisement-
Play Games
更多相關文章
  • 一、介面思想 建立關聯的橋梁,方便管理代碼 介面思想提現:為類拓展功能 介面類:用來定義功能的類,為繼承它的子類提供功能的。 該類的功能方法一般不需要有實現體,實現體有繼承它的子類自己去實現。 介面類:用來定義功能的類,為繼承它的子類提供功能的。 該類的功能方法一般不需要有實現體,實現體有繼承它的子 ...
  • volatile是java虛擬機提供的輕量級的同步機制 JMM(Java記憶體模型)是圍繞著併發編程中原子性、可見性、有序性這三個特征來建立的 原子性:一個操作或多個操作要麼全部執行完成且執行過程不被中斷,要麼就不執行。 可見性:當多個線程同時訪問同一個變數時,一個線程修改了這個變數的值,其他線程能夠 ...
  • 包_繼承 1.包 包(package) 用於管理程式中的類,主要用於解決類的同名問題。包可以看成目錄。 包的作用: 【1】防止命名衝突 【2】允許類組成一個單元模塊,便於管理 【3】更好的保護類、屬性和方法 1.1定義包 package用於定義包,形如:package 路徑(包名) 必須寫到源文件的 ...
  • 1.包(package) 包(package) 用於管理程式中的類,主要用於解決類的同名問題。包也可以看成一個目錄。 包的作用 [1] 防止命名衝突。 [2] 允許類組成一個單元(模塊),便於管理和維護。 [3] 更好的保護類、屬性和方法 。 1.1 如何定義包 使用package進行定義,應放在源 ...
  • LinkedBlockingQueue的實現方式? LinkedBlockingQueue是有界的還是無界的隊列? LinkedBlockingQueue相比ArrayBlockingQueue有什麼改進? ...
  • 在JDK1.8以前,介面(interface)沒有提供任何具體的實現,在《JAVA編程思想》中是這樣描述的:“interface這個關鍵字產生了一個完全抽象的類,它根本就沒有提供任何具體的實現。它允許創建者確定方法名、參數列表和返回類型,但是沒有任何方法體。介面只提供了形式,而未提供任何具體實現”。 ...
  • 星空不問趕路人,時光不負有心人,你可以脫變。 1.電腦的初步認識 2.解釋器的安裝 python2.7(2020年官方不在維護) python3.6 (官方推薦) 1.下載安裝包 https://www.python.org/ftp/python/2.7.14/python-2.7.14.amd6 ...
  • Tomcat的常用內置對象 1.request內置對象 所謂內置對象就是容器已經創建好了的對象,如果收到一個用戶的請求就會自動創建一個對象來處理客戶端發送的一些信息,這個內置對象就是request。類型是javax.servlet.http.HttpServletRequest。 request內置 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...