1. 程式人生 > >Java第十二周作業

Java第十二周作業

相關 同步 mark 很快 對象鎖 文件 通信 同步代碼塊 成了

1.本周學習總結

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

技術分享圖片

1.1.1 請解釋Thread類和Runnable接口實現多線程的區別

  • Thread類繼承於Runnable接口,是Runnable接口的子類,使用Runnable接口實現多線程可以避免單繼承的限制
  • 使用Runnable接口實現多線程可以更加方便地實現數據共享的概念。

    1.1.2 休眠

  • Thread.currentThread用法與this相似,用於取得當前執行的線程對象
  • Thread.sleep()主要是休眠,感覺像是一起休眠,實際上有一些微小的先後差異
  • 優先級越高的線程對象,越有可能先執行

    2.書面作業

    本次作業題集 多線程

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

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

  • BallRunnable類的作用是實現Runnable接口,使之可以被Thread接收,並調用start()方法啟動線程。
  • 有利於觀察多個球的運動軌跡,如果不加入休眠的話,運行完之後此線程很快結束顯示的就只是小球最終的位置了,看不到運行軌跡

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

  • Ball.java做的兩件事: 1.移動小球 2.返回小球的平面坐標
  • BallComponent對象是用於添加小球以及將小球畫出
  • 內部的ArrayList用於存儲小球對象
  • 程序運行過程中,只生成了一個BallComponent對象。
  • 在點擊start按鈕的時候,每點擊一下都會生成一個小球運動,可見每個小球是在不同的線程中進行繪制。

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

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

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

  • Thread類繼承於Runnable接口,是Runnable接口的子類,使用Runnable接口實現多線程可以避免單繼承的限制
  • 使用Runnable接口實現多線程可以更加方便地實現數據共享的概念。

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

  • 6-1:通過創建一個類繼承與Thread類,以此繼承其中的start()方法,然後在通過覆寫run()方法滿足題目要求。
  • 6-11:與6-1類似,但是是通過implements關鍵字實現Runnable接口,並覆寫當中的run()方法實現題目要求
  • 6-3:通過創建匿名Thread對象和匿名Runnable接口對象new Thread(new Ruannble(){})而後通過匿名內部類的形式覆寫run()方法,這種方法比前兩種更加簡潔

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

    技術分享圖片

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

  • 通過聲明一個boolean變量flag來控制run的運行,在這裏,如果flag為true就停止,為false就進行,可以創建一個stopMe()方法來修改flag變量的值。

技術分享圖片

2.3. 互斥訪問

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

技術分享圖片

2.4. 互斥訪問與同步訪問

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

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

  • 還可以通過同步塊實現互斥同步訪問

技術分享圖片

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

  • 同步代碼塊:是在方法內部使用synchronized關鍵字以及(this)獲取當前線程對象,然後再進行同步操作,是在方法內部實現
  • 同步方法:是通過synchronized關鍵字聲明方法,使之在調用該方法的時候就進行同步操作。

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

  • 通過使用synchronized關鍵字,使得當有線程再使用這一部分程序的時候,給程序上鎖,此時如果有其他線程要訪問這些內容就需要等待鎖被解開,當在使用的線程操作完後,將鎖解開,此時其他線程可以進行訪問。

技術分享圖片

  • 就像此代碼運行結果,只有當A線程執行完之後才可以輪到其他線程執行賣票操作

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

  • synchronized關鍵字
  • wait,notify關鍵字以及volatile關鍵字

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

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

技術分享圖片

  • 運行結果不正常,結果顯示在運行過程中倉庫已經滿了的情況下,添加貨物的操作無法進行但是仍然計數了,所以導致最後剩余的貨物不為0

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

技術分享圖片

技術分享圖片

技術分享圖片

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

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

2.6.2 運行視頻

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

3.碼雲及PTA

題目集:多線程

3.1 碼雲代碼提交記錄

  • 在碼雲的項目中,依次選擇“統計-Commits歷史-設置時間段”, 然後搜索並截圖

技術分享圖片

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

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

技術分享圖片

技術分享圖片

3.3 統計本周完成的代碼量

需要將每周的代碼統計情況融合到一張表中。

周次 總代碼量 新增代碼量 總文件數 新增文件數
1 120 120 2 2
2 280 160 5 3
3 590 310 10 5
4 780 190 12 2
5 1290 510 17 5
6 1710 420 20 3
7 2513 803 24 4
8 2513 0 24 0
9 3014 501 27 3
10 3441 327 30 3
11 4121 680 37 7
12 4667 546 42 5

Java第十二周作業