20155231 2016-2017-2 《Java程序設計》第6周學習總結

20155231 2016-2017-2 《Java程序設計》第6周學習總結

教材學習內容總結

學習目標

  • 理解流與IO
  • 理解InputStream/OutPutStream的繼承架構
  • 理解Reader/Writer繼承架構
  • 會使用裝飾類
  • 會使用多線程進行併發程序設計

第十章:輸入/輸出

InputSream與OutputStream

  • Java中,輸入串流表明對象爲java.io.InputStream實例,輸出串流表明對象爲java.io.OutputStream實例。
  • 在進行InputStream與OutputStream的相關操做時若發生錯誤,會拋出java.io.IOException異常。不使用InputStream與OutputStream時必須使用close()方法關閉串流。
  • FileInputStream是InputStream的子類,用於銜接文檔以讀入數據,FileOutputStream是OutputStream的子類,用於銜接文檔以讀出數據。
  • System.in與System.out分別是InputStream與PrintStream的實例,分別表明標準輸入和標準輸出。標準輸出導向至文檔,執行程序時使用>。例如>java Hello>Hello.txt,使用>>則是附加信息。
  • System.err爲printStream實例,稱爲標準錯誤輸出串流,它是用來當即顯示錯誤信息。
  • FileInputStream主要操做InputStream的read()抽象方法,FileOutputStream主要操做OutputStream的write()抽象方法。FileInputStream、FileOutputStream在讀取、寫入文檔時,以字節爲單位。
  • 打包器類:使用打包器類能夠爲輸入/輸出的數據作加工處理。經常使用打包器有:
  • +具備緩衝做用的BufferedInputStream、BufferedOutputStream(read()和write()能夠到這裏看是否有緩存的數據,節省時間)
  • +具有數據處理做用的DateInputStream、DateOutputStream(提供讀取、寫入java基本數據類型的方法)
  • +具有對象串行化能力的ObjectInputStream、ObjectOutputStream
  • java.io.Serializable()接口沒有定義任何方法,只用來標示這個對象是能夠串行化的。
  • 串行化時不但願被寫出的數據成員能夠標上transient。

字符處理類

  • Reader與Writer操做了Closeable接口,其父接口爲AutoCloseable接口。Reader讀入時先置入char數組中。
  • FileReader是一種Reader,主要用於讀取文檔並將讀到的數據轉換爲字符,StringWriter是一種Writer,能夠將字符數據寫至StringWriter,最後使用toString()方法取得字符串,表明全部寫入的字符數據。
  • 能夠指定-Dfil.encoding來指定FileReader、FileWriter所使用的編碼。
  • 經常使用字符處理裝飾器:InputStreamReader與OutputStreamWriter對串流數據打包;BufferedReader與BufferedWriter提供緩存區做用;PrintWriter對OutputStream和Writer打包,提供print()、println()、format()等方法

第十一章:線程與並行API

線程

  • 在main()之外獨立設計流程,能夠撰寫類操做java.lang.Runnable接口,流程的進入點是在run()方法中,加裝的額外CPU就是建立Thread實例,執行流程的進入點也定義在這兒。另外一個撰寫多線程程序的方式,就是繼承Thread類,從新定義run()方法,從新定義也能夠執行其中的流程。
  • 在某些必須以匿名類語法構建Thread的場合,能夠考慮用Lambda表達式操做Runnable,而後再用以創建Thread。例如:
Thread someThread=new Thread(){
public void run(){
//方法操做內容
}
};
能夠改成用如下較簡潔的方式操做:
Thread someThread=new Thread((->{
//方法操做內容
}};
  • 線程週期

並行API

  • 多線程程序可基於java.util.concurrent包中的API創建更穩固的並行應用程序,.util.concurrent包中提供接口:
  • +Lock:Lock接口的額主要操做類之一爲ReentrantLock,能夠達到synchronized的做用,調用其中的try Lock()取得鎖定返回true,沒法取得時不會中斷而是返回flase。
  • +ReadWriteLock接口定義了讀取鎖定與寫入鎖定行爲,可使用readLock()、writeLock()方法返回Lock操做對象。它在沒有任何讀取或寫入鎖定時才能夠取得寫入鎖定,能夠用StampedLock類解決。例如:
  • private StampedLock lock=new stampedLock();
  • 線程若調用get()方法進行讀取操做,先取得讀取鎖定,這樣其餘線程後續也可再取得讀取鎖定。
  • +Condition,其中的await()、signal()、signalAll()方法可視爲Object的wait()、notify()、notifyAll()方法的對應。

教材學習中的問題和解決過程

  • 問題1:synchronized互斥性與可見性
  • 問題1解決方案:在java中對於可見性的要求,可使用volatile達到變量範圍,在變量上聲明volatile,表示變量是不穩定、易變的,也就是可能在多線程下存取,其存取必定是在共享內存中進行,代碼以下:
package cc.openhome;

class Variable1 {
    static int i = 0, j = 0;

    static void one() {
        i++;
        j++;
    }

    static void two() {
        System.out.printf("i = %d, j = %d%n", i, j);
    }
}

public class Variable1Test {
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            while (true) {
                Variable1.one();
            }
        });
        Thread thread2 = new Thread(() -> {
            while (true) {
                Variable1.two();
            }
        });
        
        thread1.start();
        thread2.start();
    }
}
  • 問題2:P334Thread JoinDemo.java中後面的解釋說沒有加jion()最後一行的描述會先執行完畢,是由於ThreadB使用了sleep()。我沒有在程序中看到sleep()在哪兒操做?
  • 問題2解決方案:應該是ThreadB屬於Thread的的子類,可直接使用Thread中定義的一些方法。
  • 問題3:使用Condition提升效率?
  • 問題3解決方案:一個Condition對象可表明有一個等待集合,能夠重複調用Lock的newCondition(),取得多個Condition實例,這表明了能夠有多個等待集合。而p362中改寫的Clerk類,由於使用了一個Condition,因此實際上也只有一個等待集合,做用將相似11.11.6節中的Clerk類。若是有兩個等待集合:一個給生產者線程用,一個給消費者線程用,生產者只通知消費者等待集合,消費者只通知生產者等待集合,會比較有效率。

代碼調試中的問題和解決過程

  • 問題1:p343頁代碼中的DeadLockDemo爲何會發生死結狀況?而個人沒有發生?
    html

  • 問題1解決方案::由於兩個線程在執行cooparate()方法取得目前Resource鎖定後,嘗試調用另外一Resource的doSome(),因沒法取得另外一Resource的鎖定而阻斷。會不會發生死結是概率性問題。
    java

  • 問題2:如何解決死結
  • 問題2解決方案:線程因沒法同時取得兩個Resource的鎖定時,乾脆釋放已取得的鎖定,就能夠解決問題;git

代碼託管

本週代碼量:

總代碼量:
api

上週考試錯題總結

  • 現有:
    list是一個合法的集合引用,getCollection()返回一個合法集合的引用,哪一個是合法的?
for(Object o  :  getCollection());
for(lterator i=list.iterator(); i.hasNext  ();  )
  • Which of the following methods will not compile?
    :
private void method2(int age) {
if (age > 30)
throw Exception();
}
protected double method4() throws Exception {
throw new Throwable();
}
  • 下列屬於非受檢異常的是哪項?
    :(OutOfMemoryError)

結對及互評

評分標準

  1. 正確使用Markdown語法(加1分):
    • 不使用Markdown不加分
    • 有語法錯誤的不加分(連接打不開,表格不對,列表不正確...)
    • 排版混亂的不加分
  2. 模板中的要素齊全(加1分)
    • 缺乏「教材學習中的問題和解決過程」的不加分
    • 缺乏「代碼調試中的問題和解決過程」的不加分
    • 代碼託管不能打開的不加分
    • 缺乏「結對及互評」的不能打開的不加分
    • 缺乏「上週考試錯題總結」的不能加分
    • 缺乏「進度條」的不能加分
    • 缺乏「參考資料」的不能加分
  3. 教材學習中的問題和解決過程, 一個問題加1分數組

  4. 代碼調試中的問題和解決過程, 一個問題加1分緩存

  5. 本週有效代碼超過300分行的(加2分)
    • 一週提交次數少於20次的不加分
  6. 其餘加分:
    • 週五前發博客的加1分
    • 感想,體會不假大空的加1分
    • 排版精美的加一分
    • 進度條中記錄學習時間與改進狀況的加1分
    • 有動手寫新代碼的加1分
    • 課後選擇題有驗證的加1分
    • 代碼Commit Message規範的加1分
    • 錯題學習深刻的加1分
    • 點評認真,能指出博客和代碼中的問題的加1分
    • 結對學習狀況真實可信的加1分
  7. 扣分:
    • 有抄襲的扣至0分
    • 代碼做弊的扣至0分
    • 遲交做業的扣至0分

點評模板:

  • 博客中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 代碼中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 基於評分標準,我給本博客打分:XX分。得分狀況以下:xxx多線程

  • 參考示例架構

點評過的同窗博客和代碼

其餘(感悟、思考等,可選)

本週採起了新的考試方式,雖然發生了一點意外,但這都不重要,重要的是發現了本身還有許多問題存在,這個系統考試暴露了本身對代碼理解不夠,學習有待增強。併發

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第6周 608/1774 1/6 14/108

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。oop

參考:軟件工程軟件的估計爲何這麼難軟件工程 估計方法

  • 計劃學習時間:14小時

  • 實際學習時間:20小時

  • 改進狀況:加快學習效率

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表
)

參考資料

相關文章
相關標籤/搜索