201621123010《Java程序設計》第11周學習總結


1. 本週學習總結

1.1 以你喜歡的方式(思惟導圖或其餘)概括總結多線程相關內容。


2. 書面做業

本次PTA做業題集多線程java

1. 源代碼閱讀:多線程程序BounceThread

1.1 BallRunnable類有什麼用?爲何代碼中須要調用Thread.sleep進行休眠?

git

  • BallRunnable類實現了Runnable接口,以便於實現多線程,(實現多線程另外一方式,繼承Thread類);
  • 調用Thread.sleep方法強制當前正在執行的線程進入休眠(暫停執行),以減慢線程。

1.2 Ball.java只作了兩件事,這兩件事分別是什麼?BallComponent對象是幹什麼的?其內部的ArrayList有什麼用?程序運行過程當中,生成了幾個BallComponent對象?該程序使用了多線程技術,每一個小球是分別在不一樣的線程中進行繪製嗎?

多線程

  • move()方法使用了Rectangle2D類規劃了小球的移動軌跡;
  • getShape()方法使用了Ellipse2D.Double以double精度定義橢圓(即得到小球的形狀)。
  • BallComponent中的add方法用於添加新的小球,paintComponent用於繪製小球;ArrayList用於存儲小球。
  • 生成了一個BallComponent對象comp
  • addBall()方法內,每添加一個新的小球后會執行一次t.start(),因此小球是分別在不一樣的線程中進行繪製的。

2. 實驗總結:題集(多線程)

2.1 題目:Thread、PrintTask、Runnable與匿名內部類。

並回答:a)經過定義Runnable接口的實現類來實現多線程程序比經過繼承自Thread類實現多線程程序有何好處?b) 6-1,6-3,6-11實驗總結。
性能

  • 6-1須要注意的是要使用MyThread類的構造方法將參數n傳遞給run方法;
  • 6-3中Thread.currentThread().getName()方法用於獲取當前正在執行的線程的名稱,所以要獲取哪一個線程的名稱,就要把這句代碼放到對應的線程內;
  • 6-11除類名以及輸出的標識信息與6-1不一樣外,其餘基本一致。
  • 一個類只能繼承一個父類,以繼承自Thread類來實現多線程程序則沒法再繼承其餘的父類;可是以實現接口來講,一個類能夠實現多個接口。

2.2 使用Lambda表達式改寫6-3

2.3 題目:6-2(Runnable與中止線程)。回答:須要怎樣才能正確地中止一個運行中的線程?

:使用退出標誌,定義一個boolean型的標誌位,在運行過程當中判斷標誌是否符合退出條件。6-2中即是將boolean型的flag變量設置爲while循環的判斷條件,當flag爲true時,則循環條件while(!flag)爲false,中止線程。學習


3. 互斥訪問

3.1 修改TestUnSynchronizedThread.java源代碼使其能夠同步訪問。(關鍵代碼截圖,需出現學號)

變量id爲共享資源,在對變量id進行操做的方法用synchronized對象鎖修飾
線程


4. 互斥訪問與同步訪問

完成題集6-4(互斥訪問)與6-5(同步訪問)設計

4.1 除了使用synchronized修飾方法實現互斥同步訪問,還有什麼辦法可使用synchronized實現互斥同步訪問,使用代碼說明(請出現相關代碼及學號)?

同步代碼塊
3d

4.2 同步代碼塊與同步方法有何區別?

:同步方法直接在方法上加synchronized實現加鎖,同步代碼塊則在方法內部加鎖,同步方法鎖的範圍比較大,而同步代碼塊範圍要小點,通常同步的範圍越大,性能就越差,通常須要加鎖進行同步的時候,範圍越小越好,這樣性能更好。code

4.3 實現互斥訪問的原理是什麼?請使用對象鎖概念並結合相應的代碼塊進行說明。當程序執行synchronized同步代碼塊或者同步方法時,線程的狀態是怎麼變化的?



如上圖,x爲三個線程的共享資源,當三個線程不發生衝突時,理論上應獲得的輸出爲30,而此處未對使用共享資源的add方法以synchronized 修飾,致使線程有可能產生衝突。當使用了synchronized修飾add方法後,等因而爲資源x加上了一個鎖;當線程t1執行到synchronized同步代碼塊或者同步方法時,,此時t1將鎖取走,得到了對x進行操做的權限,因爲鎖只有一個,t2,t3此時就沒法調用x資源,只能等t1結束線程將鎖歸還後,t2或t3得到了這個鎖後,才能開始對x執行操做。component

4.4 Java多線程中使用什麼關鍵字實現線程之間的通訊,進而實現線程的協同工做?

  • wait()等待
  • notify() 喚醒在此對象監視器上等待的單個線程
  • notifyAll() 喚醒在此對象監視器上等待的全部線程

5. 線程間的合做:生產者消費者問題

5.1 運行MyProducerConsumerTest.java。正常運行結果應該是倉庫還剩0個貨物。多運行幾回,觀察結果,並回答:結果正常嗎?哪裏不正常?爲何?

: 結果不正常,由於入庫和出庫的速度不同,因此有可能在庫空時就執行出庫操做,也有可能在庫滿時執行入庫操做。

5.2 使用synchronized, wait, notify解決該問題(關鍵代碼截圖,需出現學號)


6. 面向對象設計做業-圖書館管理系統

6.1 系統的功能模塊表格,表格中體現出每一個模塊的負責人。

功能 負責人
User Status(身份權限)、id、password屬性及構造方法、登錄、註冊 本次圖書館系統全部功能實現爲獨立完成
GeneralUser 普通用戶構造方法,繼承User類,賦身份generaluser 周彪 201621123010
Admin 管理員構造方法,繼承User類,賦身份admin
Books 書籍構造方法、賦書籍名稱
Library 上架新書、下架舊書、借書、還書、展現圖書館書籍信息、展現個人書包書籍信息、用戶\管理員界面 (根據身份權限不一樣展現不一樣界面,賦予不一樣方法的操做權限)
Main 調用各方法

6.2 運行視頻

6.3 講解本身負責的模塊,並粘貼本身負責模塊的關鍵代碼(出現學號及姓名)。

本次實驗爲獨立完成。
實驗各方法內容其實均相似,登陸、註冊、上/下架書籍以及借閱歸還書籍均爲在文件上操做,基本上都是實現對文件的寫入以及讀取便可,本次實驗對文件的操做都是先將文件信息讀入ArrayList,再對ArrayList進行操做,操做結束後有必要的話再將ArrayList存儲的數據寫回文件;本次實驗須要考慮的是針對圖書館的使用者不一樣,,對應的權限也不一樣,因此須要在登陸時對用戶進行身份判斷,根據身份顯示相應的用戶界面以及賦予相應的操做權限,另外爲了區分開不一樣身份的信息,使用了兩個存儲用戶信息的文件,一個存儲管理員的帳號密碼,一個存儲普通用戶的帳號密碼,根據身份打開對應文件查找是否存在輸入的帳號信息。註冊時也是這樣,根據身份將身份信息存入不一樣的文件內。而存儲圖書的文件這裏也用了兩個,一個爲存儲圖書館內的書籍信息,一個存儲用戶的書包內書籍信息,可是實際上須要更多的用戶書包文件,爲每個用戶都分配一個書包文件,實驗只是爲了方便操做才只用一個。
點擊查看代碼


3.碼雲及PTA

題目集:多線程

3.1. 碼雲代碼提交記錄

  • 在碼雲的項目中,依次選擇「統計-Commits歷史-設置時間段」, 而後搜索並截圖
  • 必須出現幾個要素:提交日期-用戶名(姓名與學號)-不提交說明

3.2 截圖"多線程"PTA提交列表

須要有兩張圖(1. 排名圖。2.PTA提交列表圖)

3.3 統計本週完成的代碼量

須要將每週的代碼統計狀況融合到一張表中。

周次 總代碼量 新增代碼量 總文件數 新增文件數
1 90 90 5 5
2 322 232 11 6
3 652 330 16 5
4 946 294 21 5
5 1347 401 26 5
6 1591 244 28 2
7 2118 527 31 3
8 2627 509 39 8
9 2912 285 42 3
10 3171 259 50 8
11 3830 659 58 8
相關文章
相關標籤/搜索