1. 程式人生 > >oo課程回顧

oo課程回顧

作業 內容 輸出 課程 分享 schedule 繼續 以及 身體

通過這三次作業的訓練,初步掌握了多線程的設計方法。這三次作業讓我對這門課有了更深刻的認識,這門課的確是一門重課,不僅是大難度、高強度,還有它的持久性,吳際老師稱其為“昆侖課程”毫不為過。這是身體與心理的雙重礪煉。雖然開始有些落後與大部分同學,但經過努力追趕,卻也緊緊跟上進度了。

第七次作業--出租車的呼叫:

作業內容:

  本次作業模擬出租車的乘客呼叫與應答系統,訓練線程安全設計方法,同時應用面向對象分析方法和設計原則來開展分析和設計。

  作業涉及的對象主要是地圖、出租車和出租車調度系統。乘客的請求從控制臺輸入,乘客發出請求後,系統向以乘客為中心的4x4區域內的出租車廣播,收到廣播的出租車進行搶單,廣播有一定的時間窗口,窗口關閉後,系統從所有搶單的出租車中,根據出租車信用和出租車與乘客的距離來選擇一輛合適的出租車。出租車服務結束後,需要把此次服務的路徑、時間等信息輸出到文件中。

作業設計:

  下面這張圖片是這次作業的類圖。主要的類有出租車Taxi類,調度Scheduler類和地圖RoadMap類。從線程的角度看,共有100個出租車線程,因請求而產生的調度線程,主調度線程,輸入處理線程和主線程。輸入處理線程負責接收控制臺輸入並處理,主調度線程對每一請求創建一個調度線程,調度線程在4x4區域廣播然後選擇一輛出租車,出租車服務結束後,調度線程輸出信息,然後結束。線程之間的關系可以從後面的協作圖中看到。

  RoadMap可以存儲地圖,找出兩點間的最短路徑,判斷由某點向某個方向是否有路。路徑是一個Path對象,由方向+距離表示。作業中每條路的長度都相同,所以就省略了距離信息,只記錄方向。Path對象是不可變的,因此是線程安全的。整個程序裏只有一個RoadMap對象,但把它設計為不可變對象,因此也是線程安全的,不同的出租車可以同時調用shortestPath()方法。

  由於要輸出出租車的軌跡,出租車某一時刻的狀態,為了管理這些信息,分別用PathRecord對象和TaxiInfo對象來記錄。PathRecord對象是可變的,可以添加新的軌跡。TaxiInfo對象是不可變的。此外,不可變對象還有Request對象,Point對象,這些不可變對象都是線程安全的。

  出租車類有serve(), wander(), rest(), takeOrder()方法,分別對應出租車的服務,等待,停止,接單狀態。出租車線程主要與調度線程進行交互,因此,將線程協同與同步控制的重點放在出租車線程和調度線程的設計上。

技術分享圖片

時序圖:

技術分享圖片

第6次以及第5次作業的類圖:

技術分享圖片

技術分享圖片

總結:

通過3次作業的學習,對多線程有了更深刻的了解,第九次作業出租車的挑戰會更難,所以要一定繼續加油。

oo課程回顧