20145202馬超 2016-2017-2 《Java程序設計》第6周學習總結
教材學習內容總結
-
進程:是一個正在執行中的程序,每一個進程都有一個執行程序,該順序是一個執行路徑,或者說是一個控制單元。
-
線程:就是進程中的一個獨立的控制單元,線程在控制着進程的執行。
-
一個進程至少有一線程。
-
Java VM 啟動的時候會有一個java進程java.exe
-
該進程中至少一個線程負責java程序的執行,而且這個線程運行的代碼存在於main方法之中,該線程被稱為主線程。
-
自定義代碼中自定義線程:通過對api的查找,java已經提供了對線程這類食物的描述,就Three類。
-
創建線程的方式:繼承Thread類。
1.定義類繼承Thread類。
2.復寫Thread類中的run方法。
3.調用線程的start方法。 -
為什么要覆蓋run方法?
Thread類用於描述線程,該類就定義了一個功能,用於存儲線程要運行的代碼,該存儲功能就是run方法。
也就是說Thread類中的run方法,用於存儲線程要運行的代碼。 -
將running接口子類對象作為實際參數傳遞給Thread類的構造函數。
-
為什么要講running接口子類傳遞給Thread的構造函數?
以你為自定義的run方法所屬的對象是runnable接口的子類對象,所以要讓線程去指定對象的run方法,就必須明確該run方法所屬對象。 -
調用Thread類的start方法開啟線程並調用running接口子類run方法
-
線程間的通訊:
其實就是多個線程在操作同一個資源,但是操作的動作不同。 -
字符流兩個分類:
1.inputsteam
2.outputsteam
流(Stream)是對輸入輸出的抽象,注意輸入輸出是相對程序而言的
InputStream與OutputStream
InputStream、OutStream提供串流基本操作,如果想要為輸入/輸出的數據做加工處理,則可以使用打包器類。常用的打包器具備緩沖區作用的BufferedOutputStream、BufferedInputStream,具備數據轉換處理的DataInputStream、DataOutputStream,具備對象串行化能力的ObjectInputStream、ObjectOutputStream等。 -
write:對空文件寫入數據
read:讀取單個字符
read(char【】 cbuf):講字符讀入數組
read(char【】 cbuf,int off,int len):講字符讀入數組的某一部分
read(CharBuffer target)試圖將字符讀入制定的字符緩沖區。 -
Reader與Writer
Reader、Writer也有一些裝飾器類可供使用。如果串流處理的字節數據,實際上代表某些字符的編碼數據,而你想要將這些字節數據轉換為對應的編碼字符,可以使用InputStreamReader、OutputStreamWriter對串流數據打包。BufferedReader、BufferedWriter可對Reader、Writer提供緩沖區作用,在處理字符輸入/輸出時,對效率也會有所幫助。PrintReader、PrintStream使用上極為類似,不過除了可以對OutputStream打包之外,PrintWriter還可以對Writer進行打包,提供print()、println()、format()等方法。
字符處理裝飾器 -
想要將這些字節數據轉換為對應的編碼字符,可以使用InputStreamReader、OutputStreamWriter對串流數據打包。
BufferedReader、BufferedWriter可對Reader、Writer提供緩沖區作用,在處理字符輸入/輸出時,對效率也會有所幫助。
PrintWriter還可以對Writer進行打包,提供print()、println()、format()等方法。 -
並行API:
基於Thread類和Runnable接口編程很容易實現基本的並行編程任務,但實現復雜的並行程序就會比較困難,因為要詳細考慮資源的同步訪問以及設計必要數據結構支持同步訪問。從Java5后,Java平台提供了java.util.concurrent包以及HighLevelAPI簡化並行編程模型,並提供了很多支持同步訪問數據結構滿足編程需要。
Lock(鎖對象):相對與Thread模型的隱式的鎖對象,Lock提供了顯式的鎖操作從而簡化應用程序。Executors:提供了一組HighLevelAPI用來執行和管理並行任務。 ConcurrentCollections(並行集合):包含了一組支持並行處理的數據結構,大大簡化了並行編程難度。AtomicVariables(原子變量):減少了同步操作並且避免數據不一致。Fork/Join框架:提供了進程操作的支持。
CopyOnWriteArrayList操作了List接口,顧名思義,這個類的實例在寫入操作時,內部會建立新數組,並復制原有數組索引的參考,然后在新數組上進行寫入操作,寫入完成后,再將內部原參考舊數組的變量參考至新數組。對於一個很少進行寫入操作,而使用迭代器頻繁的情景下,可以使用CopyOnWriteArrayList提高迭代器操作的效率。BlockingQueue是Queue的子接口,新定義了put()與take()等方法,線程若調用put()方法,在隊列已滿的情況下會被阻斷,線程若調用了take()方法,在隊列為空的情況下會被阻斷。ConcurrentMap是Map的子接口,其定義了putIfAbsent()、remove()、replace()等方法。這些方法都是原子操作。putIfAbsent()在鍵對象不存在ConcurrentMap中時,才可置入鍵/值對象,否則返回鍵對應的值對象。remove()只有在鍵對象存在,且對應的值對象等於指定的值對象,才將鍵/值對象移除。replace()有兩個版本,其中一個版本是只有在鍵對象存在,且對應的值對象等於指定的值對象,才將值對象置換,另外一個版本是在鍵對象存在時,將值對象置換。 -
單線程程序是從開始到結束只有一個流程:
-
多線程程序:一個程序擁有多個流程。
撰寫多線程程序的方式:操作Runnable接口,在run()中定義額外流程;繼承Thread類,在run()中定義額外流程; -
差別:操作Runnable接口的好處就是較有彈性,類還有機會繼承其他類;若繼承了Thread類,那該類就是一種Thread,通常是為了直接利用Thread中定義的一些方法,才會繼承Thread來操作。
-
如果主程序中啟動了額外線程,默認會等待被啟動的所有線程都執行完run()方法才中止JVM。如果一個Thread被標示為Daemon線程,在所有的非Daemon線程都結束時,JVM自動就會終止。
-
在調用Thread實例start()方法后,基本狀態為可執行(Runnable)、被阻斷(Blocked)、執行中(Running)。
線程有其優先權,可使用Thread的setPriority()方法設定優先權,可設定值為1到10,默認是5,超出1到10外的設定值會拋出IllegalArgumentException。數字越大優先權越高,排班器越優先排入CPU,如果優先權相同,則輸流執行。 -
如果A線程正在運行,流程中允許B線程加入,等到B線程執行完畢后再繼續A線程流程,則可以使用join()方法完成這個需求。
線程完成run()方法后,就會進入Dead,進入Dead(或已經調用過start()方法)的線程不可以再次調用start()方法,否則會拋出IllegalArgumentException。
如果要停止線程,最好自行操作,讓線程跑完應有的流程,而非調用Thread的stop()方法。不僅停止線程必須自行根據條件操作,線程的暫停、重啟,也必須視需求操作,而不是直接調用suspend()、resume()等方法。 -
每個線程產生時,都會歸入某個線程群組,這視線程是在哪個群組中產生,如在main()主流程中產生一個線程,該線程會屬於main線程群組。如果沒有指定,則歸入產生該子線程的線程群組,也可以自行指定線程群組,線程一旦歸入某個群組,就無法更換群組。
-
每個對象都會有個內部鎖定,或稱為監控鎖定。被標示為synchronized的區塊將會被監控,任何線程要執行synchronized區塊都必須先取得指定的對象鎖定。
-
如果在方法上標示synchronized,則執行方法必須取得該實例的鎖定。synchronized不只可聲明在方法上,也可以描述句方式使用。不正確的使用可能會造成死結。
-
Java的synchronized提供的是可重入同步,也就是線程取得某對象鎖定后,若執行過程中又要執行synchronized,嘗試取得鎖定的對象又是同一個,則可以直接執行。
-
執行synchronized范圍的程序代碼期間,若調用鎖定對象的wait()方法,線程會釋放對象鎖定,並進入對象等待集合而處於阻斷狀態,其他線程可以競爭對象鎖定,取得鎖定的- - 線程可以執行synchronized范圍的程序代碼。
-
放在等待集合的線程不會參與CPU排班,wait()可以指定等待時間,時間到之后線程會再次加入排班,如果指定時間0或不指定,則線程會持續等待,直到被中斷(調用interrupt()或是告知notify())可以參與排班。
-
被競爭鎖定的對象調用notify()時,會從對象等待集合中隨機通知一個線程加入排班,再次執行synchronized前,被通知的線程會與其他線程共同競爭對象鎖定;如果調用notifyAll(),所有等候集合中的線程都會被通知參與排班,這些線程會與其他線程共同競爭對象鎖定。
在使用高級並行API時,Condition接口的操作對象可實現Object的wait()、notify()、notifyAll()功能。
在使用高級並行API時,Future接口的操作對象可以讓你在未來取得執行結果。
教材學習中的問題和解決過程
-
問題1:
那么問題來了,我不小心刪掉了第五周的代碼,而且為了解決git里面的問題pull下來過一次,現在雲端和我自己客戶端上都沒有第五周的代碼,去哪里找呢?
-
問題1解決方案:
代碼調試中的問題和解決過程
-
問題1:
-
問題1解決方案:XXXXXX
代碼托管
上周考試錯題總結
- 填空:”Hello”.substring( 0,2 )的值是“He”
這個問題我只試過在括號里填寫證書發現怎么也出不來答案,不知道還能用逗號這種方式。
結對及互評
我與20145303結對,我的評論在他的博客里,他博客的鏈接是:(http://www.cnblogs.com/Vivian517/p/6659252.html).
評分標准
-
正確使用Markdown語法(加1分):
-
模板中的要素齊全(加1分)
-
教材學習中的問題和解決過程, 一個問題加1分
-
代碼調試中的問題和解決過程, 一個問題加1分
-
本周有效代碼超過300分行的(加0分)
-
其他加分:
- 感想,體會不假大空的加1分
- 進度條中記錄學習時間與改進情況的加1分
- 有動手寫新代碼的加1分
- 代碼Commit Message規范的加1分
- 錯題學習深入的加1分
- 結對學習情況真實可信的加1分
-
扣分:無
點評模板:
-
博客中值得學習的或問題:
提出的問題還是有點少 -
代碼中值得學習的或問題:
感覺我敲代碼缺乏創造力,總是引用已經寫好的java方法。 -
基於評分標准,我給本博客打分:10分。
點評過的同學博客和代碼
其他(感悟、思考等,可選)
感覺每周兩章任務量應該算是比較多的,壓力很大,我已經連續兩天夢到java考試因為遲到所以考0分了,可見壓力之大,不知道學弟學妹們感受如何,反正這學期是又有了高三的感覺,哈哈。
學習進度條
嘗試一下記錄「計划學習時間」和「實際學習時間」,到期末看看能不能改進自己的計划能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
-
計划學習時間:16小時
-
實際學習時間:18小時
-
改進情況:
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)