20155231 2016-2017-2 《Java程序設計》第6周學習總結
教材學習內容總結
學習目標
- 理解流與IO
- 理解InputStream/OutPutStream的繼承架構
- 理解Reader/Writer繼承架構
- 會使用裝飾類
- 會使用多線程進行併發程序設計
第十章:輸入/輸出
- 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)
結對及互評
評分標準
- 正確使用Markdown語法(加1分):
- 不使用Markdown不加分
- 有語法錯誤的不加分(連接打不開,表格不對,列表不正確...)
- 排版混亂的不加分
- 模板中的要素齊全(加1分)
- 缺乏「教材學習中的問題和解決過程」的不加分
- 缺乏「代碼調試中的問題和解決過程」的不加分
- 代碼託管不能打開的不加分
- 缺乏「結對及互評」的不能打開的不加分
- 缺乏「上週考試錯題總結」的不能加分
- 缺乏「進度條」的不能加分
- 缺乏「參考資料」的不能加分
教材學習中的問題和解決過程, 一個問題加1分數組
代碼調試中的問題和解決過程, 一個問題加1分緩存
- 本週有效代碼超過300分行的(加2分)
- 其餘加分:
- 週五前發博客的加1分
- 感想,體會不假大空的加1分
- 排版精美的加一分
- 進度條中記錄學習時間與改進狀況的加1分
- 有動手寫新代碼的加1分
- 課後選擇題有驗證的加1分
- 代碼Commit Message規範的加1分
- 錯題學習深刻的加1分
- 點評認真,能指出博客和代碼中的問題的加1分
- 結對學習狀況真實可信的加1分
- 扣分:
- 有抄襲的扣至0分
- 代碼做弊的扣至0分
- 遲交做業的扣至0分
點評模板:
點評過的同窗博客和代碼
其餘(感悟、思考等,可選)
本週採起了新的考試方式,雖然發生了一點意外,但這都不重要,重要的是發現了本身還有許多問題存在,這個系統考試暴露了本身對代碼理解不夠,學習有待增強。併發
學習進度條
目標 |
5000行 |
30篇 |
400小時 |
|
第6周 |
608/1774 |
1/6 |
14/108 |
|
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。oop
參考:軟件工程軟件的估計爲何這麼難,軟件工程 估計方法
計劃學習時間:14小時
實際學習時間:20小時
改進狀況:加快學習效率
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)
參考資料