BUAA-OO 第二單元作業“電梯調度”總結與思考

一、需求分析

利用java線程的相關知識實現

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

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

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

二、思路分析

1、基于度量的程序結構分析

流程時序圖(利用SequenceDiagram插件)

注:使用UML Support插件時,采用實現runnable接口的方法生成的類關系圖更優美一點

Input類(三次作業復用):

Elevator類:

第一次

?

第二次

圖太大了戳這里

第三次

圖太大了戳這里

代碼行數統計(利用Statistic插件)

第一次

第二次

第三次

代碼設計復雜度(利用MetricsReloaded插件)

ev(G)基本復雜度,用來衡量程序非結構化程度
iv(G)模塊設計復雜度,用來衡量模塊判定結構
v(G)獨立路徑條數

第一次

第二次

第三次

?

2、BUG分析

第一次:

強測中得分 100

互測:未被hack。未hack別人。

第二次:

在強測中得分 82.558(所有數據性能分幾乎為0)

未被hack。未hack到別人。

第三次:

在強測中得分? 76.9294(WA兩個數據點,其余數據性能分幾乎為0)

被hack1次,hack他人1次。

自己錯誤:出現了電梯容量已滿卻仍進人的情況。

他人錯誤:電梯換向時到了21層。

?

三、知識技能總結

1、代碼編寫層面的優化

1)第三次作業中一種快速處理換乘樓層的寫法

記A電梯為001,B電梯為010,C電梯為100.

則可乘坐的電梯的類型可以用三位二進制數來表示,例如:

在1層的人可以乘坐A、B電梯,則建立樓層1到二進制數011的映射(map)。

在3層的人只能乘坐C電梯,則簡歷樓層3到二進制數100的映射。

這樣避免了用八個等待隊列儲存所有情況的繁雜寫法。

?

2)電梯不同狀態間的切換:run方法中,用狀態機來實現,簡單直觀

 1     public void run() {
 2         while (true) {
 3             synchronized (this) {
 4                 try {
 5                     if (state == 0) {
 6                         break;
 7                     }
 8                     if (state == 1) { //main request
 9                         while (true) {
10                             if (Singleton.getInstance().isend()) {
11                                 close();
12                                 state = 0;
13                                 break;
14                             }
15                             mainRequest = Singleton.getInstance().getMainRequest();
16                             if (mainRequest == null) {
17                                 synchronized (Singleton.getInstance()) {
18                                     Singleton.getInstance().wait();
19                                 }
20                             } else {
21                                 solveMain();
22                                 break;
23                             }
24                         }
25                     }
26                     else if (state == 2) { solveUp(); } 
27                     else if (state == 3) { solveDown(); }
28                 } catch (InterruptedException e) {
29                     //DO STH
30                 }
31             }
32         }
33     }

?

2、多線程設計模式的實際運用

1)單例模式

2)生產者—消費者模式

3)線程池(Worker Thread模式)

4)觀察者模式

3、輸出日志信息 Log4j

配置log4j2-test.xml文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <configuration status="OFF">
 3     <appenders> <!—輸出模塊-->
 4         <Console name="Console" target="SYSTEM_OUT">
 5             <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
 6         </Console>
 7     </appenders>
 8     <loggers><!—日志模塊-->
 9 <logger name=“elevator.WorkerThread" level="trace" additivity="false">
10             <appender-ref ref="Console"/>
11         </logger>
12         <root level="error">
13             <appender-ref ref="Console"/>
14         </root>
15     </loggers>
16 </configuration>

?

4、JProfiler的使用

5、定點投放的實現

思路:正則表達式分離時間戳+sleep

python程序已上傳至GitHub

6、線程安全容器總結

這一單元作業中我采用了CopyOnWriteArrayList作為線程安全數組

COW(Copy On Write)機制的介紹:https://yq.aliyun.com/articles/665359

?

四、自己的一點思考

1、程序測試方法

隨機數據測試(測試cpu-time和基本的功能)+構造數據測試(測試電梯是否滿足所有限制條件)

對拍器SPJ測試的功能,同時也是構造數據時重點檢驗的功能:

是否滿足到達——開門——出入人——關門的順序。

是否滿足樓層限制

是否滿足容量要求

除此之外,三次作業重難點在于:

1)HW5:是否可正常退出線程:接收器不再接收請求,電梯繼續處理完已經讀入的請求

2)HW6:是否可將所有請求捎帶(如果有請求的區間與當前等待隊列區間不重合,是否將其放入等待隊列?)、同一樓層是否會開關兩次門

3)HW7:2->3、4->3的換乘需要特殊處理。換乘指令拆解后是否按順序執行(在人下電梯后才能從同樓層上另一電梯)。

2、優化方法

四、疑問與建議

1、對拍器的意義?

助教說,A組強測和互測成績遠好于B組和C組的一大原因是“大佬們基本人手一個評測機”。

我承認互測的確是測試的有效手段,這導致我這一單元的最大收獲就是學會寫得一手好腳本。

但當我發現自己用在寫評測機的時間遠遠大于學習多線程思想的時間的時候,我感覺自己在面向“評測機”編程。

不知道老師和助教為何大力鼓勵同學們來寫評測機。知識無窮,學什么只要用心了都會有收獲,也都會有相應的歡喜和滿足。但這種偏離正軌的導向還是會讓人感覺食之無味,棄之可惜。

2、架構or性能?

自我感覺第二單元作業的難度要低于第一單元。程序的大體架構老師在課上已經基本講過,剩下的添添補補,這三次作業竟然沒有重構。

如果說性能優化基于架構的話,那性能優化的方向是什么呢?

當我問及性能的問題時,助教和老師都在強調正確性為主,但作為兩次被性能分踩死的選手,還是想要了解一下助教出題時構想的優化的可能思路。T_T

3、b站都開源了,大佬們的代碼可以開源嗎

?如果助教覺得上面的話都沒道理的話......我只是想請求看一看大佬們的優秀代碼,學習一下。/小糾結

PS. 實驗課的題面在結束之后可以開放嗎?這樣還能復習鞏固一下下。

轉載于:https://www.cnblogs.com/Ryan0v0/p/10752795.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449161.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449161.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449161.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決報錯 javax.persistence.TransactionRequiredException: Executing an update/delete query

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如題。 場景是我想要執行一條很簡單的刪除語句。 JPA方式中使用本地sql , 寫法如下&#xff1a; ModifyingQuery("delete fr…

linux基礎知識點總結-最實用!(環境搭建,系統分區,常用命令,vim文本)

Linux系統介紹&#xff1a; Linux管理硬盤的能力非常強&#xff0c;所以我們看到的只有一個分區。 / 根目錄&#xff0c;所有文件都存儲在它下面 /bin 存儲著系統命令 /dev 設備文件&#xff08;一切皆文件&#xff09; /home 用戶主目錄&#xff0c;會自動生成用戶同名目錄 /…

遞歸實現進制轉換(C++版)

上次呢&#xff0c;我們留下了一道題&#xff0c;今天我們來一起看一看&#xff1a; 題目鏈接&#xff1a;https://www.cnblogs.com/gaozirong/p/10547434.html 這是我寫的程序&#xff0c;大家可以對照參考一下&#xff08;C&#xff09;&#xff1a; #include<bits/stdc.h…

解決 mysql 插入數據報錯: Cannot add or update a child row: a foreign key constraint fails

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 場景&#xff1a;我的情況是主表為用戶 user 表&#xff0c;從表為職位 job 表&#xff0c;其中 job 表有一個外鍵為 user 表的主鍵。 …

猶太人從未透露的12個秘密(圖)

中國人喜歡攢錢&#xff0c;西方人熱衷花錢&#xff0c;只有猶太人精于賺錢。 他們認為&#xff1a;唯有運用智慧賺錢&#xff0c;才是真正的致富之道。他們的經商智慧風靡全球&#xff0c;造就了無數的商業巨子。本文通過解讀猶太人精妙絕倫的經商之道&#xff0c;從人性、道…

vim文本編輯器的配置vimrc

在行底模式下對vim的設置只是臨時有效&#xff0c;如果想長期有效需要把這些設置語句寫入配置文件(~/.vimrc)中。 打開vim的配置&#xff1a;vim ~/.vimrc 進行編輯&#xff1a; " 顯示行號 set number" tab鍵寬度 set tabstop4" 設置自動縮進 set autoindent…

IDEA 錯誤:找不到或無法加載主類

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 從昨天開始使用IDEA開始就一直在搭建java環境&#xff0c;許久沒有使用過java&#xff0c;剛開始有些生疏&#xff0c;先建了一個最簡單…

Android 第一篇

在Android的世界里以一只萌級小菜鳥的身份起飛&#xff0c;在后面的路途中不斷的成長。轉載于:https://www.cnblogs.com/ming-michelle/p/10558328.html

如何吸引財富呢?請做這六件事吧!

一&#xff1a;投資你的債務 有一則故事到處流傳&#xff1a;當聲名浪藉的威利被問到為什么要搶劫銀行時&#xff0c;他回答道&#xff1a;“因為這里有錢。”威利可能是個惡棍&#xff0c;但不是個笨蛋。他選對了目標。不過如能夠到銀行里投資&#xff0c;而不是到這里搶劫&am…

vscode解決中文亂碼

打開文件時出現亂碼 文件->首選項->設置&#xff0c;然后在右邊用戶設置里打開settings.json &#xff0c;輸入&#xff1a; “files.autoGuessEncoding”: true, CtrlS保存一下&#xff0c;就搞定了&#xff01; 沒有做很大的修改&#xff0c;可以正常使用就行 {&qu…

Centos 7源碼編譯搭建Nginx

一、Nginx入門介紹 1. Nginx&#xff08;engine x&#xff09;&#xff1a;[?end??nks] 2. Nginx 是 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的&#xff0c;第一個公開版發布于2014年10月4日 3. 主要功能 1&#xff09;HTTP 服務器&#xff08;包含動靜分離…

數據備份、pymysql模塊

----------mysql數據備份------------- #1. 物理備份&#xff1a; 直接復制數據庫文件&#xff0c;適用于大型數據庫環境。但不能恢復到異構系統中如Windows。 #2. 邏輯備份&#xff1a; 備份的是建表、建庫、插入等操作所執行SQL語句&#xff0c;適用于中小型數據庫&#xff0…

優雅的找出ArrayList中重復的元素

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 方法1 代碼&#xff1a; public class Main { public static void main(String[] args){ List<String> list new ArrayList&…

全球通吃的九大黃金專業

出國留學的同學在選專業時尤其搖擺不定&#xff0c;選擇時需要根據以后的就業發展來挑選適合自己的專業。專業選擇得當與否&#xff0c;決定著留學生回國發展是否順利&#xff0c;決定著巨額投資是否物有所值&#xff0c;以下九類比較有發展潛力的黃金留學專業&#xff0c;供大…

C語言里最基礎的關鍵字

內建類型&#xff1a; void、char、short、int、long、float、double 自建類型&#xff1a; struct、union、enum、sizeof 類型限定符&#xff1a; auto、const、static、volatile、register、extern、typedef、signed、unsigned 分支&#xff1a; if、else、switch、case、def…

mysql 行轉列 (結果集以坐標顯示)

create table capacity(type int ,numbers int ,monthst INT ); select type, sum(case monthst when 1 then numbers else 0 end ) 一月, sum(case monthst when 2 then numbers else 0 end ) 二月, sum(case monthst when 3 then numbers else 0 end ) 三月, sum(case months…

(五)springcloud微服務分布式云架構 - 云架構代碼結構構建

上一篇介紹了《整合spring cloud云服務架構 - 企業分布式微服務云架構圖》&#xff0c;本篇我們根據架構圖進行代碼的構建。根據微服務化設計思想&#xff0c;結合spring cloud一些優秀的項目&#xff0c;如服務發現、治理、配置化管理、路由負載、安全控制等優秀解決方案&…

FastJson 中 jsonArray 轉換成 list 集合的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 今天在寫代碼時候&#xff0c;遇到了需要將json文本改成jsonobject對象&#xff0c;然后將jsonobject對象轉換成jsonArray數組&#xff…

信用卡使用十年的心得體會(圖)

從第一張信用卡開卡以來&#xff0c;用卡也十多年了。一共用過三家銀行的信用卡&#xff0c;分別是&#xff1a;招商銀行、建設銀行和交通銀行。 談不上用卡達人&#xff0c;只是將自己這十多年的使用體會&#xff0c;分享給大家吧~ 1、可按自己喜好設置還款日期——第一次…

linux命令編譯C語言程序

C語言簡介&#xff1a; BCPL->newB->C->UNIX->Linux->gcc C語言專門編寫操作系統的語言&#xff0c;所以天生適合對硬件編程&#xff0c;也以運行速度快著稱&#xff0c;也非常適合實現數據結構和算法。 由于出現時間過早&#xff0c;有很多缺陷&#xff0c;也…