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
實例,指定標准輸入來源。 - 標准輸出可以重新導向至檔案,只要執行程序時使用>將輸出結果導向至指定的檔案。如果使用>>則是附加訊息。
- 可以使用
Syste
m的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章特別多,逼得自己不得不投入時間。
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)