20162308 2016-2017-2 《程序設計與數據結構》第6周學習總結
教材學習內容總結
- 類的繼承
- 代碼復用
- 抽象類 abstract
- 方法重載 Override
- 多線程 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)來減慢速度。
代碼托管
- 代碼提交過程 & 代碼量截圖:

上周考試錯題總結
沒有考試
結對及互評
張師瑜的博客注意學習方法,書上的代碼關鍵是理解,理解了再根據書上的思路,自己敲一遍。
其他(感悟、思考等,可選)
- 關於代碼復用
- 代碼復用是一件能夠很大的提高生產力的工作,通過梳理程序的邏輯結構,建立清晰合理的面對對象模型,實現接口或繼承抽象類,來實現需求。也就是說,不要重復造輪子。利用已有的代碼,應用到當前的需求中,提高效率。
學習進度條
| 代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
|---|---|---|---|---|
| 目標 | 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小時
