天天看點

20145320 《Java程式設計》第6周學習總結

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版)》學習指導
  • ...