java第11次作業

來源:互聯網
上載者:User

標籤:blog   not   指定   boolean   his   繪製   為什麼   list   代碼塊   

一. 本周學習總結

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

二. 書面作業

本次PTA作業題集多線程

1. 原始碼閱讀:多線程程式 BounceThread1.1 BallRunnable類有什麼用?為什麼代碼中需要調用 Thread.sleep進行休眠?

:BallRunnable類是支援多線程的類,開啟了一個程式,使小球按照指定的規則移動,然後畫出來獲得小球的形狀。代碼中調用Thread.sleep進行休眠是為了延緩線程完成的時間,這樣我們才能看到小球的移動,不然太快了看不到小球的移動軌跡。

1.2題:a) Ball.java只做了兩件事,這兩件事分別是什嗎?

move()方法,實現小球的移動; getShape()方法,擷取小球的座標和大小。

b) BallComponent對象是幹什麼的?

:添加小球;畫出小球。

c)其內部的ArrayList有什麼用?

:用於存放添加的小球。

d)程式運行過程中,產生了幾個BallComponent對象?

:只有1個。

e)該程式使用了多線程技術,每個小球是分別在不同的線程中進行繪製嗎?

:是。每按一次start按鈕,addBall方法都會啟動一個新線程。

2. 實驗總結:題集(多線程)2.1 題目:Thread、PrintTask、Runnable與匿名內部類。並回答:a)通過定義 Runnable介面的實作類別來實現多線程程式比通過繼承自 Thread類實現多線程程式有何好處?

答:Java中不支援多繼承,只能繼承一個父類,但可以繼承多個介面,所以使用實現介面的方法可以避免繼承的局限。使用Runnable實現多線程使多個線程一起完成多個任務。

b) 6-1,6-3,6-11實驗總結。
  • 6-1: 在構造該線程的時候,將要迴圈的次數num傳入。然後重寫run()方法。最後使用System.out.println(Thread.currentThread().getName()+" "+isAlive())列印標識資訊。
  • 6-3:在Main方法中啟動一個線程t1,該線程列印3行資訊: 主線程名;線程t1的線程名 ;線程t1所實現的所有介面,使用System.out.println(Arrays.toString(getClass().getInterfaces()));列印。
  • 6-11:這題主要是編寫PrintTask類實現Runnable介面,功能主要是輸出從0到n-1的整數(n在建立PrintTask對象的時候初始化)。並在最後使用System.out.println(Thread.currentThread().getName());輸出標識資訊。
2.2 使用Lambda運算式改寫6-3
Thread t1 = new Thread(        () -> {            System.out.println(mainThreadName);            System.out.println(Thread.currentThread().getName());            System.out.println(Arrays.toString(Thread.class.getInterfaces()));        });
2.3 題目:6-2(Runnable與停止線程)。回答:需要怎樣才能正確地停止一個運行中的線程?
  • 6-2:這題的重點主要是run()方法的內容。對每個傳入的word只檢查一遍(檢查完後將word置為null)。跳出無限迴圈後,使用System.out.println(Thread.currentThread().getName() + " stop")列印標識資訊。
  • 答:一般使用一個boolean類型的變數用來終止線程。使用while語句,在運行中通過改變boolean標記值,退出迴圈以達到停止線程的作用。
3. 互斥訪問3.1 修改 TestUnSynchronizedThread.java原始碼使其可以同步訪問。(關鍵代碼,需出現學號)

如下:

4. 互斥訪問與同步訪問

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

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

    public static void addId() {//黃子穎 201621123045synchronized (Counter.class) {//代表Counter類型的對象    id++;}}
  • 使用顯式的LockCondition對象:

    class Account {//黃子穎 201621123045private int balance;public Account(int balance) {    super();    this.balance = balance;}public int getBalance() {    return balance;}public void deposit(int money) {    lock.lock();    try {        balance += money;        condition.signalAll();    } finally {        // TODO: handle finally clause        lock.unlock();    }}public void withdraw(int money) {    lock.lock();    try {        while (balance < money) {            try {                condition.await();            } catch (InterruptedException e) {                throw new RuntimeException(e);            }        }        balance -= money;    } finally {        // TODO: handle finally clause        lock.unlock();    }}private java.util.concurrent.locks.Lock lock = new java.util.concurrent.locks.ReentrantLock();private java.util.concurrent.locks.Condition condition = lock.newCondition();}
4.2 同步代碼塊與同步方法有何區別?
  • 同步方法直接在方法上使用 synchronized修飾,實現加鎖;而同步代碼塊在內部使用synchronized代碼塊。
  • 同步代碼塊的效能更好些,但是同步方法的範圍比較大。
4.3 實現互斥訪問的原理是什嗎?請使用對象鎖概念並結合相應的代碼塊進行說明。當程式執行 synchronized同步代碼塊或者同步方法時,線程的狀態是怎麼變化的?

答:原理是當資源被一個任務使用時,其上加鎖。現在在訪問某項資源的任務必須鎖定這種資源,這時其他任務無法訪問它。其被解鎖時,另一個任務可以鎖定並且使用該資源了。例如:在下面的程式碼片段中,可以獲得對象“this”上的內部鎖。當執行程式時,如果不能獲得相對應的對象鎖,那麼將不能執行上述代碼塊中的內容,即synchronized同步代碼塊中的i++語句,就必須等待,等待獲得對象鎖。從而通過對象鎖實現了互斥訪問。

class MyCounter{   private int i = 0;   public void increment(){           //i++;           synchronized (this) {        i++;           }   }    ……}

線程的狀態的變化為:如果沒有獲得對象鎖就進入Look Pool狀態,等待同步鎖被釋放;同步鎖釋放後,線程進入Runnable狀態。

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

答:Java多線程中使用wait()notify()/notifyAll()方法來實現線程之間的通訊,進而實現線程的協同工作的。

5. 線程間的合作:生產者消費者問題5.1 運行MyProducerConsumerTest.java。正常運行結果應該是倉庫還剩0個貨物。多運行幾次,觀察結果,並回答:結果正常嗎?哪裡不正常?為什嗎?

運行結果如下


答:結果可能會不正常,剩餘貨物可能不為0,可能是其他的數量。因為生產者與消費者的存取速度不一致,可能出現了沒有庫存還在取貨物的情況。

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

如下:

6. 物件導向設計作業-圖書館管理系統6.1 系統的功能模組表格,表格中體現出每個模組的負責人。6.2 運行視頻6.3 講解自己負責的模組,並粘貼自己負責模組的關鍵代碼(出現學號及姓名)。三.碼雲及PTA

題目集:多線程

3.1. 碼雲代碼提交記錄

在碼雲的項目中,依次選擇“統計-Commits曆史-設定時間段”, 然後搜尋並
必須出現幾個要素:提交日期-使用者名稱(姓名與學號)-不提交說明

3.2 "多線程"PTA提交列表

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


3.3 統計本周完成的代碼量

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

周次 行數 新增行數 檔案數 新增檔案數
1 115 115 17 17
2 421 306 24 7
3 698 277 30 6
5 1085 387 38 8
6 1497 412 48 10
7 2033 536 57 9
8 2265 232 60 3
9 2728 522 65 5
10 3360 632 73 8
11 3958 598 83 10
12 4435 477 90 7

java第11次作業

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.