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

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

教材學習內容總結

  • 第十章 異常處理

1.從應用程序來看,若是要將數據從源取出,可使用輸入串流。html

2.若是要將數據寫入目的地,可使用輸出串流。java

3.輸入串流表明對象爲java.io.inputStream實例,輸出串流對象爲java.io.oututStram實例。
==注意==在不使用inputstream與outputstream時,必須使用close()關閉串流,也可以使用JDK7嘗試自動關閉資源語法。git

4.FileInputStream與InputStream的子類,能夠指定文件名建立實例,一旦建立文檔就開啓,接着可用來寫數據==不使用時都要使用close()關閉文檔==數組

5.InputStream、outputstream提供串流基本操做,若是想要爲輸入輸出的數據作加工處理,可使用打包器類。安全

6.經常使用的打包器具備緩衝區做用的BufferedInputStream、Bufferedoutputstream。多線程

7.具有數據轉換處理做用的DataInputStream、DataOutputStream。架構

8.具有對象串行化能力的ObjectInputStream、ObjectOutputStream等。dom

9.對字符數據的讀取,提供了java.io.Reader類。ide

10.對字符串的寫入提供了java.io.writer類。函數

11.FileReader、FileWriter能夠對文檔作讀取與寫入,讀取或寫入時默認使用操做系統默認編碼作字符轉換。
==提示==再啓動JVM時,能夠指定-Dfile.encoding來指定所使用的編碼。

12.Reader,Writer有一些裝飾器類能夠用,若是串流處理數據的字節數據,實際上表明某些字符的編碼數據,而想要字節數據裝換爲對應的編碼字符,可以使用InputStreamReader,OutputSteamWriter對串流數據打包。

13.BufferedReader,BufferedWriter可對Reader,Writer提供緩衝區做用。對效率有所幫助。

14.PrintWriter與PrintStream使用上極爲類似,除了對Outputstream打包以外,printwriter還能夠對writer進行打包。

15.父類中的方法,核心類:
image
image

16.標準輸入輸出:

標準輸入輸出

System.in:標準輸入,默認關聯到鍵盤(終端輸入)

System.out:標準輸出,默認關聯到顯示器(終端輸出)

System.err:標準錯誤,默認關聯到顯示器(終端輸出)

輸入輸出重定向:setIn,setOut,setErr

  • 第十一章

1.使用java.lang.Thread的靜態sleep()方法,讓目前流程暫停指定時間==注意==指定的單位是毫秒。

2.線程的生命週期
image

3.撰寫類操做java.lang.runnable接口,達到main之外獨立設置流程。

4.建立Thread實例來執行Runnable實例定義的run()方法,使從main開始的流程由主線程執行。

5.要啓動線程執行指定流程,調用Thread實例的start()方法。

6.除了將流程定義在Runnable的run()方法以外,另外一個撰寫多線程程序的的方式,就是繼承Thread類,從新定義run()方法。

7.操做Runnable接口的好處就是較有彈性,類還能夠繼承其餘類。

8.若是主線程中啓動了額外線程,默認會等待被啓動的全部線程都執行完,run()方法才終止JVM。

9.若Thread被標示爲Daemon線程,在全部的非DAaemon線程都結束時,JVM就會自動終止。

11.在調用Thread實例start()方法後,基本狀態爲可執行,被阻斷,執行中。

12.線程有優先權,可以使用Thread的setpriority()方法設定優先權,設定值爲1到10,默認爲5。==超出設定值會拋出IllegalArgumentException==

13.數字越大,優先權越高,排班器越優先排入CPU==注意==若是優先權相同,則輸流執行。

14.當某線程進入Blocked時,將另外一線程排入cpu執行,避免cpu空閒下來,是改進效能的方式之一。

15.線程因輸入輸出進入Blocked狀態後,在阻斷狀況結束後,會回到Runnable狀態,等待排班器排入執行。一個進入Blocked狀態的線程,能夠由另外一個線程調用該線程的Interrupt()方法,使離開Blocked狀態。

16.若是A線程正在運行,流程中容許B線程加入,等到B線程執行完畢後再繼續A線程流程,則可使用join()方法完成這個需求。

17.線程完成Run()方法後就會進入Dead,不能夠再調用start()方法,不然拋出

IllegalThreadStateException

18.Thread類上定義有stop()方法,不過被標示爲Deprecated,表示過去確實定義過,後來由於某些問題,這些API沒有直接剔除。

19.若要中止線程,最好自行操做,不要使用stop()方法(包括暫停,重啓)

20.線程一旦進入某個羣組,就沒法更換羣組。

21.線程存取同一對象相同資源時,可能引起競速狀況,這樣的類是不安全的。

22.每一個對象都會有個內部鎖定。被標示爲synchronized的區塊將被監控。

23.若在方法上標示synchronized,則執行方法必須取得該實例的鎖定。

24.執行synchronized範圍的程序代碼期間,若調用鎖定對象的wait()方法,線程會釋放對象鎖定,並進入對象等待集合,處於阻斷狀態。

25.放在等待的線程不會參與cpu排班,wait()能夠指定等待時間,時間到以後線程會再次加入排班。
==注意==若是指定時間爲0或不指定,則線程會持續等待,直到被中斷或告知。

26.被競爭鎖定的對象用notify()時,會從對象等待集合中隨機通知一個線程加入。若是調用notifyAll(),全部等待集合中的線程都會被通知參與排班,這些會與其餘線程共同競爭對象鎖定。

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

  • 問題一

課本p305頁代碼中

while ((length = input.read(data)) != -1)

這裏代碼中的-1有什麼用?

  • 解決方案一:

在上網查找了一下獲得以下結果:雖然代碼不同,可是知道了-1表明了讀取完畢。
image
image
image

  • 問題二

課本p325頁代碼:

boolean isHareSleep = flags[((int) (Math.random() * 10)) % 2];
            if(isHareSleep) {
                out.println("兔子睡著了zzzz");
            } else {
                hareStep += 2;    
                out.printf("兔子跑了 %d 步...%n", hareStep);

在這裏,flags數組有什麼做用?

  • 解決方案:

個人理解是flag數組中隨機函數產生的隨機數非0的數字,數組就爲非空,即boolean的值爲True,反之,數組爲空,即爲False。能夠用來判斷兔子是否隨機睡覺。

  • 問題三

線程退出後,進程就退出了,主線程建立的線程沒有執行完就退出了。怎麼解決

  • 解決方案

兩個方式:
一、主線程等待子線程,用join;
二、子線程設置本身爲守護線程。

  • 問題四

進程中線程之間的關係?

  • 解決問題

線程不像進程,一個進程中的線程之間是沒有父子之分的,都是平級關係。即線程都是同樣的, 退出了一個不會影響另一個。

可是所謂的"主線程"main,其入口代碼是相似這樣的方式調用main的:exit(main(...))。

main執行完以後, 會調用exit()。

exit() 會讓整個進程over終止,那全部線程天然都會退出。

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

  • 問題一:p309頁運行時出現錯誤
    image
    image
  • 解決方案:
    上網搜索出現這個錯誤的緣由,結果以下:image
    image
    image總結了一下,就是由於沒有對args[]傳值,沒有加入參數,因此致使越界錯誤聲明。

  • 問題二:
    課本p339頁

package Thread;

public class ArrayListDemo {

    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        Thread thread1 = new Thread(() -> {
            while (true) {
                list.add(1);
            }
        });

        Thread thread2 = new Thread(() -> {
            while (true) {
                list.add(2);
            }
        });

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

按照書上的代碼打上去,運行結果應該是發生ArrayIndexOutOfBoundException異常,可是在我編譯的時候出現了以下錯誤:
image
image

  • 解決方案:

在仔細看書後,檢查到了緣由,是由於這個是用了課本6.2.5節中的方法,可是由於沒有把這些程序放到同一個包中,因此找不到符號,不是代碼自己的問題,由於在這個包中就沒有定義這個方法。而書上全部代碼都在同一個包中,因此編譯能夠經過。

  • 問題三:
    課本p350-p353 producer,consumer,代碼編譯都出現相似問題,顯示找不到符號,可是此次代碼都在同一個包中,因此出現了問題。
    image
  • 解決方案:
    image
    如上圖,在編譯時應注意先編譯producer,和consumer,最後在編譯含有main的主類,三個編譯才能經過,最後在雲心時必定要在同一個包中才能運行。

代碼託管

  • 代碼提交過程截圖:

image
image
image
image

結對及互評

評分標準(滿分10分)

  1. 從0分加到10分爲止
  2. 正確使用Markdown語法(加1分):
    • 不使用Markdown不加分
    • 有語法錯誤的不加分(連接打不開,表格不對,列表不正確...)
    • 排版混亂的不加分
  3. 模板中的要素齊全(加1分)
    • 缺乏「教材學習中的問題和解決過程」的不加分
    • 缺乏「代碼調試中的問題和解決過程」的不加分
    • 代碼託管不能打開的不加分
    • 缺乏「結對及互評」的不能打開的不加分
    • 缺乏「上週考試錯題總結」的不能加分
    • 缺乏「進度條」的不能加分
    • 缺乏「參考資料」的不能加分
  4. 教材學習中的問題和解決過程, 一個問題加1分

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

  6. 本週有效代碼超過300分行的(加2分)
    • 一週提交次數少於20次的不加分

6 其餘加分:

  • 週五前發博客的加1分
    • 感想,體會不假大空的加1分
    • 排版精美的加一分
    • 進度條中記錄學習時間與改進狀況的加1分
    • 有動手寫新代碼的加1分
    • 課後選擇題有驗證的加1分
    • 代碼Commit Message規範的加1分
    • 錯題學習深刻的加1分
      7 扣分:
    • 有抄襲的扣至0分
    • 代碼做弊的扣至0分

點評模板:

  • 博客中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 代碼中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 基於評分標準,我給本博客打分:XX分。得分狀況以下:xxx

  • 參考示例

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20155215
    • image
    • 結對學習內容
      • 一塊兒討論課本代碼,共同解決代碼編譯報錯問題。
      • 前幾週考試留下來的部分沒有解決的試題。
      • 一塊兒看JAVA教學視頻。
      • 討論知識點,交換學習體會和學習難點。
  • 上週博客互評狀況

## 上週考試錯題總結

1. import java.util.*;
    2.
    3. Class FindStuff  {
    4.public static void main (String[]args)    {
    5,    //insert code here
    6.    c.put ("X", 123);
    7.    }
    8.  }
分別插入到第5行,哪幾行容許代碼編譯?

A .
Map c= new SortedMap();

B .
HashMap c= new HashMap();

C .
HashMap c= new Hashtable();

D .
SortedMap c= new TreeMap();

E .
ArrayList c= new ArrayList();

F .
Map c = new LinkedHashMap();

答案: B D F

3.  import java.util.*;
    4.    class ForInTest  {
    5.static List list=new ArrayList();
    6.
    7.public static void main (String  []  args)  {
    8.list. add("a"); list. add("b");list. add( "c");
    9.    //insert code here
    10.    System.out.print (o);
    11.    }
    12.  }
哪一行插入到第9行將致使輸出「abc"?

A .
for (Iterator o : list.iterator(); o.hasNext (); )

B .
for (Iterator o : list)

C .
for (Object o : list.iterator())

D .
for (Object o : list)

答案:D

  • 下列哪些項是泛型的優勢? (選兩項)
    A .
    不用向下強制類型轉換

B .
代碼容易編寫
C .
類型安全

D .
運行速度快

答案:AD

緣由:少選了C,看書看得仍是不夠仔細,只記住了大概。

  • Which of the following methods will not compile?

A .
private void method1(String name) {
if (name.equals("star"))
throw new IllegalArgumentException(name);
}

B .
private void method2(int age) {
if (age > 30)
throw Exception();
}

C .
public double method5() throws Exception {
return 0.7;
}

D .
protected double method4() throws Exception {
throw new Throwable();
}

答案:BD

  • What is the output of the following code?
class EJava {
void method() {
try {
guru();
return;
} finally {
System.out.println("finally 1");
}
}
void guru() {
System.out.println("guru");
throw new StackOverflowError();
}
public static void main(String args[]) {
EJava var = new EJava();
var.method();
}
}

A .
guru
finally 1

B .
guru
finally 1
Exception in thread "main" java.lang.StackOverflowError

C .
guru
Exception in thread "main" java.lang.StackOverflowError

D .
guru

E .
The code fails to compile.

答案:B

  • 現有:
1.   class  Parser extends  Utilis  {
   2.     public static void main (String  []  args)  {
   3 .          try  {  System. out.print (new  Parser ( ) .getlnt ("42")) ;
   4.     }  catch (NumberFormatException n) {
   5 .              System.out .println ( "NFExc" ) ;   }
   6.    }
   7.     int getlnt (String arg)  throws NumberFormatException{
   8.       return Integer.parselnt (arg) ;
   9.    }
   10. }
   11. class Utils {
   12.    int getlnt (String arg)  {  return 42;  }
   13. }

結果爲 :

A .
NFExc

B .
42

C .
42NFExc

D .
編譯失敗

答案:B

  • 現有:
1. class Flow {
 2.   public static void main(String [] args) t
 3.    try {
 4 .              System. out .print ("before") ;
 5 .                  doRiskyThing ( )  ;
 6.          System.out.print ("after ") ;
 7.    } catch (Exception fe) {
 8.          System.out.print ("catch") ;
 9.     }
 10 .          System. out .println ( " done") ;
 11.   }
 12.  public static void doRiskyThing() throws Exception{
 13.   
          }}

可能會產生哪兩項結果 ?(選兩項)

A .
before catch

B .
before after done

C .
before catch done

D .
before after catch

答案:BC

  • 現有:
1.  class Guy  {  String greet()  {  return "hi";  }  j
2.  class Cowboy extends Guy  {  String greet()  {  return. "howdy";}}
3.  class  Wrangler  extends  Cowboy  {  String  greet()  {  return  "orch!"; } }
4.
5.  class Greetings2  {
6.   public  static void main (String  []  args)  {
7.     Guy g=new Wrangler();
8.    Guy g2=new Cowboy();
9.     Wrangler w2=new Wrangler();
10.    System. out .print (g.greet()+g2.greet()+w2 .greet());
11.    }
12.  }
結果是什麼?

A .
hi hi ouch!

B .
ouch! howdy ouch!

C .
hi howdy ouch!

D .
編譯失敗

答案:B

1. abstract class Color  {
    2.protected abstract  String getRGB();
    3.  }
    4.
    5. public class Blue extends Color  {
    6.    //insert code here
    7.  }
    和四個聲明:
    public String getRGB()  {  return "blue";  }
    String getRGB()  {  return  "blue";  )
    private  String getRGB()  {  return  "blue";  }
    protected String getRGB()  {  return "blue";  )
分別插入到第6行,有幾個能夠經過編譯?

A .
0

B .
1

C .
2

D .
3

答案:C

緣由:看不太懂題目,代碼也不太看得懂,我以爲這種程序類的題,但願老師能多講解考過的試題或者課本上的代碼,幫助咱們更好地理解。由於以前的考試就只有答案沒有解析,有的題目仍是不太理解。

感悟心得

  • 對教材感悟
    第十章主要講了串流與輸入輸出的關係,認識了InputStream outputstream繼承架構,認識了reader,eriter繼承架構。第十一章認識了Thread與Runnable,使用synchronized。瞭解了wait(),notify(),notifyAll()。

  • 對考試感悟
    此次考試,使用了藍墨雲這個APP,很是的不習慣,有點手忙腳亂,不太適應這種考試,並且以爲此次題目難度加大了不少,題目篇幅也有點大,代碼類的題目加多,作不太完。還得慢慢去適應這種考試方式,提升速度與熟練度。

  • 課本中代碼的部分展現與思考

1.p314頁代碼如圖:
image
運行結果:
image
範例中有三個member實例,分別存儲爲文檔以後再讀取回來。

2.p325頁代碼以下:
image
運行結果:
image這個是課本上最簡單的,也就是隻有一個流程,就是從main()開始至結束的流程。兔子可能隨機睡覺,運用了random函數。

  1. 課本p326-p327頁將上面這個程序作了改進。

這個是兔子的流程,從run()開始。

package Thread;

public class Hare implements Runnable {
    private boolean[] flags = {true, false};
    private int totalStep;
    private int step;

    public Hare(int totalStep) {
        this.totalStep = totalStep;
    }

    @Override
    public void run() {
        while (step < totalStep) {
            boolean isHareSleep = flags[((int) (Math.random() * 10)) % 2];
            if (isHareSleep) {
                System.out.println("兔子睡着了zzzz");
            } else {
                step += 2;
                System.out.printf("兔子跑了 %d 步...%n", step);
            }
        }
    }
}

而烏龜的流程在以下代碼中:

package Thread;

public class Tortoise implements Runnable {
    private int totalStep;
    private int step;

    public Tortoise(int totalStep) {
        this.totalStep = totalStep;
    }

    @Override
    public void run() {
        while (step < totalStep) {
            step++;
            System.out.printf("烏龜跑了 %d 步...%n", step);
        }
    }
}

image
在這個程序中,主線程執行main()定義的流程,main()定義的流程中創建了tortoiseThread與hareThread兩個線程。要啓動線程執行指定流程,必須調用Thread()的start()方法。

3.p330代碼
image
image
使用了setDaemon(true)就是當前進程變爲後臺線程,對java來講,只要還有一個前臺線程在運行,這個進程就不會結束。

4.課本p331代碼:
image
image這個程序能夠指定網頁下載東西,在每次for循環,進行HTTP請求,而後進行文檔寫入。可是效率很是的低下。

5.課本333頁代碼:

image
image
Thread。sleep()會讓線程進入Block狀態,若此時有其餘線程調用該線程的interrut()方法,會拋出異常對象,就會使線程「醒過來」。

6.p334頁代碼:
image
image
當線程使用join()加入另外一線程時,另外一線程會等待被加入的線程工做完畢,而後再繼續他的動做。程序啓動後,主線程開始,在主線程中新建threadB,並在啓動後,將至加入主線程中,因此會先執行B,主線程纔會繼續本來的流程。

7.在課本p337頁,uncaughtException()方法第一個參數可取的發生異常的線程實例,第二個參數可取得異常對象,運行結果顯示了線程的名稱及異常信息。
image
image

8.課本p338頁中,t1,t2都屬於同一個Threadgroup。t2沒有設定Thread。UncaughtExceptionHandler實例。因此有默認的第三個處理方式。image
image

9.課本p344頁代碼以下:這個程序可能會發生死結,就是兩個線程都處於不放開resource鎖定的狀態,在死結髮生時陷入停頓狀態。
image
image

10.課本p345頁代碼:
image
運行以下:thread1會調用Variable1.one(),thread2會調用Variable1.two(),有可能會發生thread2調用取i值後,切換至thread1不斷執行,再切換至thread2取j值,有可能j遠大於i。
image

11.在課本p364-p366程序中,將Pages.java和DirectExecutor.java和Download.java按這個順序編譯後,運行結果下載了
image

12.課本p371代碼
image使用了newSingleThreadScheduledExecutor()返回的SchduledExecutorService。java.util.Date建立時,回去的當時系統時間,每次工做會執行2秒,然後延遲1秒,因此如圖每三秒一個間隔。
image

13.課本p374頁,在繼承RecursiveTask以後,主要將子任務與求解過程撰寫於compute()方法中,爲了不分解出過多的子任務,形成沒必要要的麻煩,n< 20就直接用循環求解。
image
image

14.課本p376-p378頁代碼,使用了BlockingQueue的操做ArrayBlockingQueue類,這樣就不用處理麻煩的wait(),notify()流程了,簡化了不少。image

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 15/15 1/1 23/26
第二週 208/240 2/2 35/38
第三週 376/584 3/3 32/38
第四周 823/1407 4/4 28/30
第五週 986/2393 5/5 21/26
第六週 1258/3651 6/6 26/25

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。

參考:軟件工程軟件的估計爲何這麼難軟件工程 估計方法

參考資料

相關文章
相關標籤/搜索