《程序設計與數據結構》第6周學習總結


20162308 2016-2017-2 《程序設計與數據結構》第6周學習總結

教材學習內容總結

  1. 類的繼承
  2. 代碼復用
  3. 抽象類 abstract
  4. 方法重載 Override
  5. 多線程 Multi-Threading

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

  • 1 關於多重繼承
  • 一致認為,在面對對象中添加多重繼承的特性對程序員來說,至少是像我這樣沒什么經驗的初學者來說,是一件非常困難的事。繼承應該是一種"is-a"的邏輯,那么多重繼承在這個角度上來說就是不合邏輯的。所以,萬幸,Java沒有在設計的時候引入這個特性。
  • 2 線程、進程 (Thread & Process)
  • 閱讀材料:
    線程和進程的區別是什么?
    《Java編程思想》
  • 去年,好想也是四月初的時候,當時我在杭電面試,當時說到了自己設計的爬蟲中實現了 Producer- Consumer 的多線程模型,然后那幾個老師就問我線程和進程有什么區別。那個時候,我自己其實也搞不懂線程和進程有什么區別,我就瞎扯了幾句。回去以后,自己查了一些資料,也對進程和線程有了一些理解。進程是CPU資源分配的最小單位,線程是依附於進程而存在的調度,一個進程中可以存在多個線程。

利用對象,可將一個程序分割成相互獨立的區域。我們通常也需要將一個程序轉換成多個獨立運行的子任務。像這樣的每個子任務都叫作一個“線程”(Thread)。編寫程序時,可將每個線程都想象成獨立運行,而且都有自己的專用CPU。一些基礎機制實際會為我們自動分割CPU的時間。我們通常不必關心這些細節問題,所以多線程的代碼編寫是相當簡便的。 這時理解一些定義對以后的學習狠有幫助。“進程”是指一種“自包容”的運行程序,有自己的地址空間。 “多任務”操作系統能同時運行多個進程(程序)——但實際是由於CPU分時機制的作用,使每個進程都能 循環獲得自己的CPU時間片。但由於輪換速度非常快,使得所有程序好象是在“同時”運行一樣。“線程” 是進程內部單一的一個順序控制流。因此,一個進程可能容納了多個同時執行的線程。 多線程的應用范圍很廣。但在一般情況下,程序的一些部分同特定的事件或資源聯系在一起,同時又不想為 它而暫停程序其他部分的執行。這樣一來,就可考慮創建一個線程,令其與那個事件或資源關聯到一起,並讓它獨立於主程序運行。一個很好的例子便是“Quit”或“退出”按鈕——我們並不希望在程序的每一部分代碼中都輪詢這個按鈕,同時又希望該按鈕能及時地作出響應(使程序看起來似乎經常都在輪詢它)。 ——《Think in Java》

//example: using class Thread
//SimpleThread.java
public class SimpleThread extends Thread{
    private int countDown = 5;
    private static int threadCount = 0;
    private int threadNumber = ++threadCount;
    public SimpleThread(){
        System.out.println("Making" + threadNumber);
    }
    public void run(){
        while(true){
            System.out.println("Thread " + threadNumber + "(" + countDown + ")");
            if(--countDown == 0)return;
        }
    }
    public static void main(String[] args) {
        for(int i = 0; i < 5; i++)new SimpleThread().start();
        System.out.println("All Threads Started");
    }
}
//example: using interface Runable
//SimpleRunable.java
class MyRunable implements Runnable{
    private String name;
    MyRunable(String name){
        this.name = name;
    }
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
            System.out.println(name + "+1s");
            Thread.sleep(1000);
            System.out.println(name + "+2s");
        } catch (Exception e) {
            System.out.println("Against Basic Law");
        }
    }
}
public class SimpleRunable{
    public static void main(String[] args) {
        MyRunable mr1 = new MyRunable("T1");
        MyRunable mr2 = new MyRunable("T2");
        Thread t1 = new Thread(mr1);
        Thread t2 = new Thread(mr2);
        t1.start();
        t2.start();
    }
}

代碼調試中的問題和解決過程

  • 多線程的程序運行時運行太快,不能觀察到順序。
  • 使用Thread.sleep(Math.Random() * 1000)來減慢速度。

代碼托管

  • 代碼提交過程 & 代碼量截圖:
  • 2017-04-07 (2).png

上周考試錯題總結

沒有考試

結對及互評

張師瑜的博客注意學習方法,書上的代碼關鍵是理解,理解了再根據書上的思路,自己敲一遍。

其他(感悟、思考等,可選)

  • 關於代碼復用
  • 代碼復用是一件能夠很大的提高生產力的工作,通過梳理程序的邏輯結構,建立清晰合理的面對對象模型,實現接口或繼承抽象類,來實現需求。也就是說,不要重復造輪子。利用已有的代碼,應用到當前的需求中,提高效率。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 26/26 1/1 7/7
第二周 81/107 1/2 8/15 String類型的使用
第三周 80/187 1/3 5/20 位運算
第四周 300/487 1/4 8/28 動態數組和迭代器
第五周 132/619 1/5 18/46 OOP編程導論
第六周 90/709 1/6 5/51 多線程
  • 計划學習時間:5小時

  • 實際學習時間:8小時

參考資料


免責聲明!

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



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