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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...