20145110 《Java程序設計》第六週學習總結

學號 《Java程序設計》第X周學習總結

教材學習內容總結

10 輸入/輸出

10.1 InputStream與OutputStream

  • Java將輸入/輸出抽象化爲串流,數據有來源及目的地,銜接二者的是串流對象。
  • FileIntputStream是InputStream的子類,用於銜接文檔以讀入數據,FileOutStream是OutputStream的子類,用於銜接文檔以寫出數據。
  • 在不使用InputStream與OutputStream時,必須使用close()方法關閉串流。因爲InputStream與OutputStrem操做了java.io.Closeable接口,其父接口爲java.lang.AutoCloseable接口。

10.1.2

1.標準輸入/輸出

  • 可使用System的setIn()方法指定InputStream實例,從新指定標準輸入來源。

2.FileInputStream與FileOutputStream

10.2字符處理類

  • 針對字符數據的讀取,Java SE提供了java.io.Reader類,其抽象化了字符數據讀入的來源。
  • 針對字符數據的寫入,則提供了java.io.Writer類。其抽象化了數據寫出的目的地。
  • 在啓動JVM時,能夠指定-Dfile.encoding來指定FileReader、FileWriter所使用的編碼。
import java.io.IOException;
import static java.lang.System.out;

public class MemberDemo {
    public static void main(String[] args) throws IOException {
        Member[] members = {
                    new Member("B1234", "Justin", 90), 
                    new Member("B5678", "Monica", 95), 
                    new Member("B9876", "Irene", 88)
        };
        for(Member member : members) {
            member.save();
        }
        out.println(Member.load("B1234"));
        out.println(Member.load("B5678"));
        out.println(Member.load("B9876"));
    }
}

運行結果:
html

10.2.2字符處理裝飾器

在Java中,對串流能夠有裝飾器,那麼對字符串也有裝飾器書中介紹了InputStreamREader與OutputStreamWriter,BufferedReader與BufferedWriter和PrintWriter這三種打包器。
1.InputStreamREader與OutputStreamWriter:
在創建InputStreamREader與OutputStreamWriter時能夠指定編碼,對字節數據轉化爲相應的編碼字符。
2.BufferedReader與BufferedWriter:
BufferedReader與BufferedWriter能夠將轉換後的數據作緩衝處理,以增長讀取效率。
3.PrintWriter:
PrintWriter與PrintStreame十分類似既能夠對OutputStream打包,也能夠對Writer打包。java

11 線程與並行API

11.1 線程

在java中,若是想在main()之外獨立設計流程,能夠撰寫類操做java.lang.Runnable接口,流程的進入點是操做在run()方法中。api

package Thread;

import static java.lang.System.out;

public class TortoiseHareRace {
    public static void main(String[] args) {
        boolean[] flags = {true, false};
        int totalStep = 10;
        int tortoiseStep = 0;
        int hareStep = 0;
        out.println("龜兔賽跑開始...");
        while(tortoiseStep < totalStep && hareStep < totalStep) {
            tortoiseStep++;
            out.printf("烏龜跑了 %d 步...%n", tortoiseStep);
            boolean isHareSleep = flags[((int) (Math.random() * 10)) % 2];
            if(isHareSleep) {
                out.println("兔子睡着了zzzz");
            } else {
                hareStep += 2;
                out.printf("兔子跑了 %d 步...%n", hareStep);
            }
        }
    }
}

它只有一個流程,它的循環控制爲烏龜或兔子走完十步,比賽結束。按照程序由上而下的運行原則,每次都是烏龜先遞增步數,而後再是兔子隨機睡覺或走兩步,二者好像並非同步的,這樣對兔子來講並不公平,因此,爲了設計一個更加公平的比賽程序,咱們但願二者能夠不受程序運行過程當中前後運行順序的干擾,同時進行步數的移動。這裏就用到了書中介紹到的多線程運行程序。多線程

package Thread;

import static java.lang.System.out;

public class TortoiseHareRace {
    public static void main(String[] args) {
        boolean[] flags = {true, false};
        int totalStep = 10;
        int tortoiseStep = 0;
        int hareStep = 0;
        out.println("龜兔賽跑開始...");
        while(tortoiseStep < totalStep && hareStep < totalStep) {
            tortoiseStep++;
            out.printf("烏龜跑了 %d 步...%n", tortoiseStep);
            boolean isHareSleep = flags[((int) (Math.random() * 10)) % 2];
            if(isHareSleep) {
                out.println("兔子睡着了zzzz");
            } else {
                hareStep += 2;
                out.printf("兔子跑了 %d 步...%n", hareStep);
            }
        }
    }
}

11.1.4關於ThreadGroup

  • ThreadGroup的某些方法,能夠對羣組中全部線程產生做用。interrupt()方法能夠中斷羣組中全部線程,setMaxPriority()方法能夠設定羣組中全部線程最大優先權。activeCount()方法獲取羣組的線程數量 。
  • 未捕捉異常會由線程實例setUncaughtExceptionHandler()設定的Thread.UncaughtExceptionHandler實例處理以後是線程ThreadGroup,而後是默認的Thread.UncaughtExceptionHandler。

11.2並行API

11.2.1Lock、ReadWriteLock與Condition

1.使用Lock

  • lock接口主要操做類之一爲ReentrantLock,能夠達到synchronized的做用。
  • Lock接口還定義了tryLock()方法,若是線程調用tryLock()能夠取得鎖定會返回true,若沒法取得鎖定並不會發生阻斷,而是返回false。

4.使用Condition

Condition接口用來搭配Lock,最基本用法就是達到Object的wait()、notify()、notifyAll()方法的做用。dom

class Resource {
    private String name;
    private int resource;

    Resource(String name, int resource) {
        this.name = name;
        this.resource = resource;
    }

    String getName() {
        return name;
    }

    synchronized int doSome() {
        return ++resource;
    }

    synchronized void cooperate(Resource resource) {
        resource.doSome();
        System.out.printf("%s 整合 %s 的資源%n",
                this.name, resource.getName());
    }
}

public class DeadLockDemo {
    public static void main(String[] args) {
        Resource resource1 = new Resource("resource1", 10);
        Resource resource2 = new Resource("resource2", 20);
        
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                resource1.cooperate(resource2);
            }
        });
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                resource2.cooperate(resource1);
            }
        });

        thread1.start();
        thread2.start();
    }
}

本週代碼託管截圖

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 200/200 1/2 20/20
第二週 300/500 1/3 18/38
第三週 500/1000 1/4 22/60
第四周 300/1300 1/5 30/90
第五週 300/1600 1/6 30/160
第六週 700/2300 2/7 30/190

參考資料

相關文章
相關標籤/搜索