Week11《java程序設計》做業總結

Week11《java程序設計》做業總結

1. 本週學習總結

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

答:java

2. 書面做業

本次PTA做業題集多線程多線程

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

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

答:實現Runnable接口,表明任務。在任務中,從新定義run方法,將要進行的流程任務代碼寫入run()。能夠經過BallRunnable類將任務指派給線程,並支持多線程。
調用Thread.sleep進行休眠,便是讓當前運行的線程放棄本身所佔用的CPU),給其餘線程運行的機會,這樣有暫停當前線程的做用。學習

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

答:this

  • Ball.java作了兩件事,一、move()方法:將小球移動到下一個位置,當小球遇到邊緣的時候,就反方向移動小球。二、getShape():在小球的當前位置得到小球的形狀。
  • BallComponent對象進行add(Ball b)添加小球,paintComponent(Graphics g)畫球兩個操做,即在面板上添加一個小球並畫出小球。內部的ArrayList用來存儲小球。
  • 一個BallComponent對象。使用了多線程技術,每次start就有一個線程開始,因此小球是在不一樣線程中繪製的。
    1.3 選作:程序改寫:程序運行時,每一個小球都是從固定位置出發。如何改寫該程序,使得當點擊start時,每一個小球能夠從不一樣位置出發、以不一樣的步進移動?
    1.4 選作:不一樣小球的移動軌跡如出一轍。改造程序,使得每一個小球運行軌跡不徹底同樣,好比有的能夠走餘弦軌跡、有的能夠走方波軌跡、有的走布朗運動、有的走五角星,等等。

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

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

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

  • 操做Runnable接口比較有彈性,讓類有機會繼承其餘類,避免單繼承的侷限性。便利多個相同代碼的線程共享資源時進行處理。多個線程共享實現類中的代碼,代碼簡潔高效。
  • 6-1:學會如何建立線程,並將任務指派給線程。任務類能夠繼承Thread類,任務代碼在複寫run方法中。
    6-3:當任務代碼較爲簡單的時候,可使用匿名內部類和lambda表達式去改寫任務代碼。
    6-11:任務類實現Runnable接口,將任務代碼寫入實現接口的子類run方法中。設計

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

    答:
Thread t1 =new Thread(() ->{
        System.out.println(mainThreadName);
        String t=Thread.currentThread().getName();
        System.out.println(t);
        System.out.println(Arrays.toString(getClass().getInterfaces()));
             });

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

答:中止線程的方法有:
一、線程自己調用stop()方法,自我終止。
二、 使用interrupt方法終止線程
三、採用boolean標誌來使線程中的run()方法退出3d

3. 互斥訪問

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

答:將用synchronized修飾Counter的方法。各個線程互斥訪問Counter的id,使得id最後結果爲0。

運行後:
code

3.2 選作:進一步使用執行器改進相應代碼(關鍵代碼截圖,需出現學號)

4. 互斥訪問與同步訪問

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

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

答:
一、使用synchronized同步程序塊。鎖住要操做的對象自己(this),誰拿到這個鎖,誰就能夠運行進行對象(this)的控制的代碼。將對象做爲鎖,就能夠操做對象控制的那段代碼。視頻

public  void deposit(int money){
    synchronized(this){
        this.balance+=money;
    }
}

public void withdraw(int money){
    synchronized(this){
        this.balance-=money;
    }

二、ReentrantLock,lock,unlock方法

public class Account {
    private Lock poolLock = new ReentrantLock();
     int balance;
    public  void deposit(int money){
        poolLock.lock();
        this.balance+=money;
        poolLock.unlock();
    }
    public void withdraw(int money){
        poolLock.lock();
        this.balance-=money;
        poolLock.unlock();
    }
}

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

答:
一、同步方法直接在方法上加synchronized實現加鎖,同步代碼塊則在方法內部加鎖,同步方法鎖的範圍比較大,而同步代碼塊範圍要小點。
二、使用的是同步方法,那麼整個方法中的全部內容都會被當作一個原子操做。而事實上在但當咱們可能只是方法中某一段內容須要同步,同步代碼塊能夠幫助咱們只在必要的地方進行同步。
三、在同步代碼塊中能夠自由的選擇鎖。在同步代碼塊中,咱們能夠自由的選擇任何一個java對象實例做爲同步過程當中要使用到的鎖。可是對於實例同步方法而言,這個鎖是不能選擇的,這個鎖只能是這個對象實例。

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

答:得到惟一的鎖來打開資源,而不容許其餘線程的任務打擾,其餘線程就先等待,notify()以後進入Lock Pool,當且僅當使用資源以後,把鎖還回去
,即poolLock.unlock(),這時候在Lock Pool的線程才能夠繼續。

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

答:使用synchronized、wait、notify等關鍵字和方法實現線程的協同合做。

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

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

答:不正常。倉庫滿的狀況下,添加貨物的操做沒有進行,但仍然有計數,最後剩餘的貨物不爲0。

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

答:

5.3 選作:使用Lock與Condition對象解決該問題。

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

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

6.2 運行視頻

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

3.碼雲及PTA

題目集:多線程

3.1. 碼雲代碼提交記錄

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

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

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


3.3 統計本週完成的代碼量

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

周次 總代碼量 新增代碼量 總文件數 新增文件數
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0
5 739 739 16 16
6 1084 345 28 12
7 1180 96 30 2
8 1627 447 35 5
9 1986 359 44 9
10 2350 364 56 12
11 2534 184 61 5
12 2909 375 70 9
相關文章
相關標籤/搜索