20145320 《Java程式設計》第6周學習總結
教材學習内容總結
第十章 輸入/輸出
流(Stream)是對「輸入輸出」的抽象,注意「輸入輸出」是相對程式而言的
10.1 InputStream與OutputStream
-
輸入串流代表對象為java.io.InputStream,輸出串流代表對象為java.io.outputStream
read()方法讀入資料
write()方法寫出資料
-
标準輸入輸出
System.in: 标準輸入,預設關聯到鍵盤(終端輸入)
System.out: 标準輸出,預設關聯到顯示器(終端輸出)
-
FileInputStream與FileOutPutStream
用于檔案讀寫
串流繼承架構如圖
10.2 字元處理類
-
java.io.Reader類中使使用者可以指定字元資料讀入的來源,java.io.Writer類中使使用者可以指定字元資料寫出的目的地。
字元處理裝飾器可對位元組資料轉換為對應的編碼字元。
第十一章 線程與并行API
11.1 線程
從以前學習的各種執行個體都是單線程的,假如設計程式有多個流程,就是所謂的多線程程式
- 在java中,如果想在main()以外獨立設計流程,可以撰寫類操作java.lang.Runnable接口,流程的進入點是操作在run()方法中。
- 在java中,從main()開始的流程會由主線程執行,可以建立Thread執行個體來執行Runnable執行個體定義的run()方法。
- JVM是台虛拟計算機,隻安裝一顆稱為主線程的CPU,可執行main()定義的執行流程。如果想要為JVM加裝CPU,就是建立Thread執行個體,要啟動額外CPU就是調用Thread執行個體的start()方法,額外CPU執行流程的進入點,可以定義在Runnale接口的run()方法中。
撰寫多線程程式的方式:
(1)将流程定義在Runnable的run()方法中
(2)繼承Thread類,重新定義run()方法
- 操作Runnable接口的好處就是較有彈性,你的類還有機會繼承其他類。若繼承了Thread,那該類就是一種Thread,通常是為了直接利用Thread中定義的一些方法,才會繼承Thread來操作。
線程生命周期
Daemon線程
-
主線程會從main()方法開始執行,直到main()方法結束後停止JVM。如果主線程中啟動了額外線程,預設會等待被啟動的所有線程都執行完run()方法才中止JVM。
在所有的非Daemon線程都結束時,JVM自動就會中止。
- setDeamon()方法用來設定一個線程是否為Daemon線程。
- isDaemon()方法可以判斷線程是否為Daemon線程。
Thread基本狀态圖
- 在調用Thread執行個體start()方法後,基本狀态為可執行(Runnable)、被阻斷(Blocked)、執行中(Running)。
- 一個進入Blocked狀态的線程,可以由另一個線程調用該線程的interrupt()方法,讓它離開Blocked狀态。
- 使用Thread.sleep()會讓線程進入Bocked狀态。
安插線程
- 當線程使用join()加入至另一個線程時,另一個線程會等待被加入的線程工作完畢,然後在繼續它的動作,join()的意思表示将線程加入稱為另一個線程的流程中。
停止線程
- 線程完成run()方法後,就會進入Dead,進入Dead的線程不可以再次調用start()方法,否則會抛出IllegalThreadStateException異常。
11.2 并行API
Lock
-
lock接口主要操作類之一為ReentrantLock,可以達到synchronized的作用。
為了避免調用Lock()後,在後續執行流程中抛出異常而無法解除鎖定,一定要在finally中調用Lock對象的unlock()方法。
- Lock接口還定義了tryLock()方法,如果線程調用tryLock()可以取得鎖定會傳回true,若無法取得鎖定并不會發生阻斷,而是傳回false。
ReadWriteLock
- ReadWriteLock接口定義了讀取鎖定與寫入鎖定行為,可以使用readLock()、writeLock()方法傳回Lock操作對象。ReentrantReadWriteLock是ReadWriteLock接口的主要操作類,readLock()方法會傳回ReentrantReadWriteLock.ReadLock執行個體,writeLock()犯法會傳回ReentrantReadWriteLock.WriteLock執行個體。
StampedLock
- StampedLock類可支援了樂觀讀取操作。也就是若讀取線程很多,寫入線程很少的情況下,你可以樂觀地認為,寫入與讀取同時發生的機會很少,是以不悲觀的使用哇暖的讀取鎖定,程式可以檢視資料讀取之後,是否遭到寫入線程的變更,再采取後續的措施。
Condition
- Condition接口用來搭配Lock,最基本用法就是達到Object的wait()、notify()、notifyAll()方法的作用。Condition的await()、signal()、signalAll()方法,可視為Object的wait()、notify()、notifyAll()方法的對應。
教材學習中的問題和解決過程
ForkJoinPool與其他的ExecutorService的差別:
-
ForkJoinPool是閑聊了工作竊取演算,其建立的線程如果完成手邊任務,會嘗試尋找并執行其他任務建立的資額任務,讓線程保持忙碌狀态,有效利用處理器的能力。
ForkJoin架構适用于計算密集式的任務,較不适合用于容易造成線程阻斷的場合。
關于ThreadGroup
- ThreadGroup的某些方法,可以對群組中所有線程産生作用,interrupt()方法可以中斷群組中所有線程,setMaxPriority()方法可以設定群組中所有線程最大優先權。
- activeCount()方法擷取群組的線程數量
- enumerate()方法要傳入Thread數組,這會将線程對象設定至每個數組索引。
- uncaughtException()方法第一個參數可取得發生異常的線程執行個體,第二個參數可取得異常對象。
代碼調試中的問題和解決過程
關于I/O流我編寫了一段簡單的代碼
結果如下
其他(感悟、思考等,可選)
- 所謂分而治之的問題,是指這些問題的解決,可以分解為性質相同的子問題,子問題還可以再分解為更小的子問題,将性質相同的子問題解決并收集運算結果,整體問題也就解決了。并行就是這樣,如果是多核電腦(如四核),假如寫在四個塊裡,并行可以同時調用四個cpu進行運算
學習進度條
代碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小時 |
第三周 | 1000/1000 | 1/3 | 20/60 |
第四周 | 300/1300 | 1/4 | 20/80 |
第五周 | 300/1600 | 1/5 | 20/100 |
第六周 | 300/1900 | 2/7 | 20/120 |
參考資料
- Java學習筆記(第8版)
- 《Java學習筆記(第8版)》學習指導
- ...