20155212 2016-2017-2 《Java程序設計》第6周學習總結
教材學習內容總結
Chapter10
- 輸入串流為
java.io.InputStream,輸出串流為java.io.OutputStream,無須理會來源或目的真正形式。 - 在不使用
InputStream和OutputStream時,必須使用close()關閉串流,但是JDK7會嘗試自動關閉資源語法。 System.in與System.out分別是InputStream與OutputStream的實例,分別代表標准是輸入與標准輸出。- 串流繼承架構


- 可以使用
System的setIn()方法指定InputStream實例,指定標准輸入來源。 - 標准輸出可以重新導向至檔案,只要執行程序時使用>將輸出結果導向至指定的檔案。如果使用>>則是附加訊息。
- 可以使用
System的setOut()方法指定PrintStream實例,將結果輸出至指定的目的地。 System.erro為PrintSteam實例,稱之為標准錯誤輸出串流,用來立即顯示錯誤訊息。- System.out輸出的訊息可以使用>或>>重新導向至檔案,但
System.err輸出的訊息一定會顯示在文本模式中,無法重新導向。 - 可以使用
System.setErr()指定PrintStream,指定標准錯誤輸出串流。 FileInputStream是InputStream的子類,可以指定文件名建構實例,一旦建構檔案就開啟,接着就可用來讀取數據。FileOutputStream是OutputStream的子類,可以指定文件名建構實例,一旦建構檔案就開啟,接着就可以用來寫出數據。- 無論是
FileInputStream或FileOutputStream,不使用時都要使用close()關閉檔案。 -
FileInputStream主要實作了InputStream的read()抽象方法,使之可從檔案中讀取數據。FileOutputStream主要實作了OutputStream的write()抽象方法,使之可寫出數據至檔案 。
DataInputStream、DataOutputStream提供讀取、寫入Java基本數據型的方法,像是讀寫int、double、 boolean等的方法。- 如果在作對象串行化時,對象中某些數據成員不希望被寫入,則可以標上
transient關鍵詞。
Chapter11
- 如果想在
main()以外獨立設計流程,可以撰寫類別實作java.lang.Runnable接口,流程的進入點是實作在run()方法中。 - 可以建構Thread實例來執行Runnable實例定義的run()方法。
- 除了將流程定義在Runnable的
run()方法中之外,另一個撰寫多線程程序的方式,是繼承Thread類別,重新定義run()方法。 - 線程有其優先權,可使用Thread的
setPriority()方法設定優先權:- 可設定值為1(Thread.MIN_PRIORITY)到10(Thread.MAX_PRIORITY),預設是5(Thread.NORM_PRIORITY)。
- 超出1到10外的設定值會拋出
IllegalArgumentException。
- 線程因輸入輸出進入Blocked狀態后,在完成輸入輸出后,會回到Runnable狀態,等待排班器排入執行(Running狀態)。
- 一個進入Blocked狀態的線程,可以由另一個線程呼叫該線程的
interrupt()方法,讓它離開Blocked狀態。 - 如果A線程正在運行,流程中允許B線程加入,等到B線程執行完畢后再繼續A線程流程,則可以使用
join()方法完成需求。 - 當線程使用
join()加入至另一線程時,另一線程會等待被加入的線程工作完畢,然后再繼續它的動作。 - 不僅有停止線程必須自行根據條件實作,線程的暫停、重啟,也必須視需求實作,而不是直接呼叫suspend()、resume()等方法。
java.lang.ThreadGroup類別可以管理群組中的線程,可以使用以下方式產生群組,並在產生線程時指定所屬群組:
ThreadGroup threadGroup1 = new ThreadGroup("group1");
ThreadGroup threadGroup2 = new ThreadGroup("group2");
Thread thread1 = new Thread(threadGroup1, "group1's member");
Thread thread2 = new Thread(threadGroup2 "group2's member");
- 想要一次取得群組中所有線程,可以使用
enumerate()方法。 - 在JDK5之后,如果
ThreadGroup中的線程發生例外時:- 如果
ThreadGroup有父ThreadGroup,就會呼叫父ThreadGroup的uncaughtException()方法。 - 否則,看看
Thread是否使用setUncaughtExceptionHandler()方法設定Thread.UncaughtExceptionHandler實例,有的話就會呼叫其uncaughtException()方法。 - 否則,看看例外是否為
ThreadDeath實例,若「是」什么都不作,若「否」則呼叫例外的printStrackTrace()。
- 如果
- 第9章介紹過的
Collection與Map,都未考慮線程安全。 - 放在等待集合的線程不會參與CPU排班。
java.util.concurrent.locks套件中提供Lock、ReadWriteLock、Condition接口以及相關實作類別,可以提供類似synchronized、wait()、notify()、notifyAll()的作用,以及更多高階功能。Lock接口還定義了tryLock()方法,如果線程呼叫tryLock()可以取得鎖定會傳回true,若無法取得鎖定傳回false。BlockingQueue是Queue的子界面:- 若呼叫
put()方法,在隊列已滿的情況下會被阻斷。 - 若呼叫
take()方法,在隊列為空的情況下會被阻斷。
- 若呼叫
ConcurrentHashMap是ConcurrentMap的實作類別ConcurrentNavigableMap是ConcurrentMap子接口,其實作類別為ConcurrentSkipListMap,可視為支持並行操作的TreeMap版本。
教材學習中的問題和解決過程
- 什么是
dump()方法?- dump是堆的意思,
dump()含義就是存儲。
- dump是堆的意思,
- 實作
Runnable於run()中定義額外流程好?還是繼承Thread於run()中定義額外流程好?- 實作
Runnable接口的好處就是較有彈性,你的類別還有機會繼承其它類別 - 若繼承了Thread,那該類別就是一種Thread,通常是為了直接利用
Thread中定義的一些方法,才會繼承Thread來實作 - 如果主線程中啟動了額外線程,預設會等待被啟動的所有線程都執行完
run()方法才中止JVM。 - 如果一個
Thread被標示為Daemon線程,在所有的非Daemon線程都結束時,JVM自動就會終止。
- 實作
- 有幾種狀況會讓線程進入Blocked狀態
- 進入
synchronized前競爭對象鎖定的阻斷 - 呼叫
wait()的阻斷 - 等待輸入輸出完成
- 進入
代碼調試中的問題和解決過程

- 之前一直commit,然后提示我本地領先遠程太多,提示我push,push過后出現上述錯誤,后來
cd ~/Java-20155212``在根目錄git commit```然后push成功。原來,在當前目錄git只能git當前目錄的代碼。
代碼托管

上周考試錯題總結
結對及互評
評分標准
-
正確使用Markdown語法(加1分):
- 不使用Markdown不加分
- 有語法錯誤的不加分(鏈接打不開,表格不對,列表不正確...)
- 排版混亂的不加分
-
模板中的要素齊全(加1分)
- 缺少“教材學習中的問題和解決過程”的不加分
- 缺少“代碼調試中的問題和解決過程”的不加分
- 代碼托管不能打開的不加分
- 缺少“結對及互評”的不能打開的不加分
- 缺少“上周考試錯題總結”的不能加分
- 缺少“進度條”的不能加分
- 缺少“參考資料”的不能加分
-
教材學習中的問題和解決過程, 一個問題加1分
-
代碼調試中的問題和解決過程, 一個問題加1分
-
本周有效代碼超過300分行的(加2分)
- 一周提交次數少於20次的不加分
-
其他加分:
- 周五前發博客的加1分
- 感想,體會不假大空的加1分
- 排版精美的加一分
- 進度條中記錄學習時間與改進情況的加1分
- 有動手寫新代碼的加1分
- 課后選擇題有驗證的加1分
- 代碼Commit Message規范的加1分
- 錯題學習深入的加1分
- 點評認真,能指出博客和代碼中的問題的加1分
- 結對學習情況真實可信的加1分
-
扣分:
- 有抄襲的扣至0分
- 代碼作弊的扣至0分
- 遲交作業的扣至0分
點評模板:
-
博客中值得學習的或問題:
- 博客內容不夠深刻
-
代碼中值得學習的或問題:
-
基於評分標准,我給本博客打分:10分。得分情況如下:
- 正確使用Markdown語法,加1分
- 模板中的要素齊全,加1分
- 教材學習中的問題和解決過程, 一個問題加1分,共1個問題,加1分
- 本周有效代碼超過300分行的(加2分)
- 感想,體會不假大空的加1分
- 排版精美的,加1分
- 進度條中記錄學習時間與改進情況的,加1分
- 代碼Commit Message規范的,加1分
- 錯題學習深入的加1分
點評過的同學博客和代碼
其他(感悟、思考等,可選)
學習進度條
| 代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
|---|---|---|---|---|
| 目標 | 5000行 | 30篇 | 400小時 | |
| 第一周 | 18/18 | 1/1 | 10/10 | |
| 第二周 | 172/190 | 1/2 | 18/38 | |
| 第三周 | 464/654 | 1/3 | 23/61 | |
| 第四周 | 876/1530 | 1/4 | 28/89 | |
| 第五周 | 831/2361 | 1/5 | 15/114 | |
| 第六周 | 1404/2765 | 1/6 | 24/138 |
嘗試一下記錄「計划學習時間」和「實際學習時間」,到期末看看能不能改進自己的計划能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
-
計划學習時間:24小時
-
實際學習時間:24小時
-
改進情況:比以前有了很大的進步,但是主要原因還是在於第11章特別多,逼得自己不得不投入時間。
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)

