1. 程式人生 > >201621123078《Java程序設計》第11周學習總i結

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

int 結束 看書 出錯 tun cer 加鎖 粘貼 pri

1. 本周學習總結

1.1 以你喜歡的方式(思維導圖或其他)歸納總結多線程相關內容。

技術分享圖片

2. 書面作業

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

1.1 BallRunnable類有什麽用?為什麽代碼中需要調用Thread.sleep進行休眠?

Answer:BallRunnable類實現類Runnable接口,支持多線程的操作,調用Thread.sleep進行休眠是為了能夠推遲線程完成的時間,讓其他線程運行,如果沒有的話,程序結束的很快,就看不到小球的運行軌跡。

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

Answer:

Q1:

  • 定義了小球移動的函數move();
  • 定義了小球的大小和坐標函數getShape();

Q2:

  • BallComponent對象是用來添加新的小球,並將其在程序運行過程中畫出。
  • 其內部的ArrayList是用來存儲我們所看到的小球。
  • 只生成了一個BallComponent對象
  • 是的,在運行面板中,每點擊一次start,就產生了了一個新的線程。
1.3 選做:程序改寫:程序運行時,每個小球都是從固定位置出發。如何改寫該程序,使得當點擊start時,每個小球可以從不同位置出發、以不同的步進移動?

Answer:在ball.java中 getShape()函數將x,y,dx,dy,改成隨機生成的即可:
技術分享圖片

1.4 選做:不同小球的移動軌跡一模一樣。改造程序,使得每個小球運行軌跡不完全一樣,比如有的可以走余弦軌跡、有的可以走方波軌跡、有的走布朗運動、有的走五角星,等等。

技術分享圖片

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

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

並回答:a)通過定義Runnable接口的實現類來實現多線程程序比通過繼承自Thread類實現多線程程序有何好處?

Answer:由於java的單繼承機制,你繼承Thread類的話,那麽這個自定義線程類就不能再繼承其它的類;而接口可以實現多個,所以通過實現Runnable接口來實現的話,那麽這個實現類還可以繼承其它的類。

b) 6-1,6-3,6-11實驗總結。

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

Answer:
技術分享圖片

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

Answer:
在該題中,我們需要編寫一個 stopMe()方法來停止終止線程,主要是通過定義一個flag,true時正常退出,。停止一個線程可以用Thread.stop()方法,但最好不要用它。雖然它確實可以停止一個正在運行的線程,但是這個方法是不安全的,而且是已被廢棄的方法。我們可以使用個boolean類型的變量標記值,在while循環中來停止線程。

參考博客:https://www.cnblogs.com/greta/p/5624839.html

3. 互斥訪問

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

技術分享圖片

4. 互斥訪問與同步訪問

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

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

Answer:可以使用synchronized關鍵字同步代碼塊來實現互斥同步訪問。
技術分享圖片

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

Answer:

  • 同步方法:
    即有synchronized關鍵字修飾的方法。由於java的每個對象都有一個內置鎖,當用此關鍵字修飾方法時,內置鎖會保護整個方法。在調用該方法前,需要獲得內置鎖,否則就處於阻塞狀態。
  • 同步代碼塊:
    即有synchronized關鍵字修飾的語句塊。被該關鍵字修飾的語句塊會自動被加上內置鎖,從而實現同步。

相比較而言,同步方法的作用範圍比同步代碼塊大。

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

Answer:進程間相互排斥的使用臨界資源的現象,就叫互斥,原理是當資源被一個任務占用時,在其上加鎖,其他任務無法訪問它直至這個資源被解鎖,被解鎖後,就會有另一個任務可以使用該資源,以此類推。

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

在Java中可以用wait () 和notify()/notifyAll()方法來協調線程間的運行進度(讀取)關系

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

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

Answer:
技術分享圖片
技術分享圖片
結果不正常,剩余的貨物會存在不為0的情況。因為在add和remove之間只是存在互斥關系,沒有同步,存取速度不一,從而導致結果出錯。

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


技術分享圖片

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

6.1 系統的功能模塊表格,表格中體現出每個模塊的負責人。
成員 負責模塊
呂煒彬 借圖書、查看已借圖書
余碩銘 查看個人信息、瀏覽圖書
蘇誌穎 還書、時光流逝
6.2 運行視頻
6.3 講解自己負責的模塊,並粘貼自己負責模塊的關鍵代碼(出現學號及姓名)。

我負責的借圖書和查看已經借圖書的部分。
借圖書:
技術分享圖片
查看書籍狀態:
技術分享圖片

3.碼雲及PTA

3.1. 碼雲代碼提交記錄

技術分享圖片

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

技術分享圖片
技術分享圖片

3.3 統計本周完成的代碼量

周次 總代碼量 新增代碼量 總文件數 新增文件數
1 0 0 0 0
2 280 280 5 5
3 530 250 9 4
4 950 420 15 6
5 1345 395 20 5
6 1924 579 26 6
7 2248 324 31 5
8 2677 429 36 5
9 3020 343 42 6
10 3349 329 48 6
11 3725 376 54 6

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