20155212 2016-2017-2 《Java程序設計》第6周學習總結


20155212 2016-2017-2 《Java程序設計》第6周學習總結

教材學習內容總結

Chapter10

  • 輸入串流為java.io.InputStream,輸出串流為java.io.OutputStream,無須理會來源或目的真正形式。
  • 在不使用InputStreamOutputStream時,必須使用close()關閉串流,但是JDK7會嘗試自動關閉資源語法。
  • System.inSystem.out分別是InputStreamOutputStream的實例,分別代表標准是輸入與標准輸出。
  • 串流繼承架構

  • 可以使用SystemsetIn()方法指定InputStream實例,指定標准輸入來源。
  • 標准輸出可以重新導向至檔案,只要執行程序時使用>將輸出結果導向至指定的檔案。如果使用>>則是附加訊息。
  • 可以使用System的setOut()方法指定PrintStream實例,將結果輸出至指定的目的地。
  • System.erroPrintSteam實例,稱之為標准錯誤輸出串流,用來立即顯示錯誤訊息。
  • System.out輸出的訊息可以使用>或>>重新導向至檔案,但System.err輸出的訊息一定會顯示在文本模式中,無法重新導向。
  • 可以使用System.setErr()指定PrintStream,指定標准錯誤輸出串流。
  • FileInputStreamInputStream的子類,可以指定文件名建構實例,一旦建構檔案就開啟,接着就可用來讀取數據。
  • FileOutputStreamOutputStream的子類,可以指定文件名建構實例,一旦建構檔案就開啟,接着就可以用來寫出數據。
  • 無論是FileInputStreamFileOutputStream,不使用時都要使用close()關閉檔案。
    • FileInputStream主要實作了InputStreamread()抽象方法,使之可從檔案中讀取數據。
    • FileOutputStream主要實作了OutputStreamwrite()抽象方法,使之可寫出數據至檔案 。
  • DataInputStreamDataOutputStream提供讀取、寫入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,就會呼叫父ThreadGroupuncaughtException()方法。
    • 否則,看看Thread是否使用setUncaughtExceptionHandler()方法設定Thread.UncaughtExceptionHandler實例,有的話就會呼叫其uncaughtException()方法。
    • 否則,看看例外是否為ThreadDeath實例,若「是」什么都不作,若「否」則呼叫例外的printStrackTrace()
  • 第9章介紹過的CollectionMap,都未考慮線程安全。
  • 放在等待集合的線程不會參與CPU排班。
  • java.util.concurrent.locks套件中提供LockReadWriteLockCondition接口以及相關實作類別,可以提供類似synchronizedwait()notify()notifyAll()的作用,以及更多高階功能。
  • Lock接口還定義了tryLock()方法,如果線程呼叫tryLock()可以取得鎖定會傳回true,若無法取得鎖定傳回false
  • BlockingQueueQueue的子界面:
    • 若呼叫put()方法,在隊列已滿的情況下會被阻斷。
    • 若呼叫take()方法,在隊列為空的情況下會被阻斷。
  • ConcurrentHashMapConcurrentMap的實作類別ConcurrentNavigableMapConcurrentMap子接口,其實作類別為ConcurrentSkipListMap,可視為支持並行操作的TreeMap版本。

教材學習中的問題和解決過程

  • 什么是dump()方法?
    • dump是堆的意思,dump()含義就是存儲。
  • 實作Runnablerun()中定義額外流程好?還是繼承Threadrun()中定義額外流程好?
    • 實作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當前目錄的代碼。

代碼托管

上周考試錯題總結

結對及互評

評分標准

  1. 正確使用Markdown語法(加1分):

    • 不使用Markdown不加分
    • 有語法錯誤的不加分(鏈接打不開,表格不對,列表不正確...)
    • 排版混亂的不加分
  2. 模板中的要素齊全(加1分)

    • 缺少“教材學習中的問題和解決過程”的不加分
    • 缺少“代碼調試中的問題和解決過程”的不加分
    • 代碼托管不能打開的不加分
    • 缺少“結對及互評”的不能打開的不加分
    • 缺少“上周考試錯題總結”的不能加分
    • 缺少“進度條”的不能加分
    • 缺少“參考資料”的不能加分
  3. 教材學習中的問題和解決過程, 一個問題加1分

  4. 代碼調試中的問題和解決過程, 一個問題加1分

  5. 本周有效代碼超過300分行的(加2分)

    • 一周提交次數少於20次的不加分
  6. 其他加分:

    • 周五前發博客的加1分
    • 感想,體會不假大空的加1分
    • 排版精美的加一分
    • 進度條中記錄學習時間與改進情況的加1分
    • 有動手寫新代碼的加1分
    • 課后選擇題有驗證的加1分
    • 代碼Commit Message規范的加1分
    • 錯題學習深入的加1分
    • 點評認真,能指出博客和代碼中的問題的加1分
    • 結對學習情況真實可信的加1分
  7. 扣分:

    • 有抄襲的扣至0分
    • 代碼作弊的扣至0分
    • 遲交作業的扣至0分

點評模板:

  • 博客中值得學習的或問題:

    • 博客內容不夠深刻
  • 代碼中值得學習的或問題:

  • 基於評分標准,我給本博客打分:10分。得分情況如下:

  1. 正確使用Markdown語法,加1分
  2. 模板中的要素齊全,加1分
  3. 教材學習中的問題和解決過程, 一個問題加1分,共1個問題,加1分
  4. 本周有效代碼超過300分行的(加2分)
  5. 感想,體會不假大空的加1分
  6. 排版精美的,加1分
  7. 進度條中記錄學習時間與改進情況的,加1分
  8. 代碼Commit Message規范的,加1分
  9. 錯題學習深入的加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章特別多,逼得自己不得不投入時間。

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表
)

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM