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.父類中的方法,核心類:
16.標準輸入輸出:
標準輸入輸出
System.in:標準輸入,默認關聯到鍵盤(終端輸入)
System.out:標準輸出,默認關聯到顯示器(終端輸出)
System.err:標準錯誤,默認關聯到顯示器(終端輸出)
輸入輸出重定向:setIn,setOut,setErr
1.使用java.lang.Thread的靜態sleep()方法,讓目前流程暫停指定時間==注意==指定的單位是毫秒。
2.線程的生命週期
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表明了讀取完畢。
課本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終止,那全部線程天然都會退出。
解決方案:
上網搜索出現這個錯誤的緣由,結果以下:
總結了一下,就是由於沒有對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異常,可是在我編譯的時候出現了以下錯誤:
在仔細看書後,檢查到了緣由,是由於這個是用了課本6.2.5節中的方法,可是由於沒有把這些程序放到同一個包中,因此找不到符號,不是代碼自己的問題,由於在這個包中就沒有定義這個方法。而書上全部代碼都在同一個包中,因此編譯能夠經過。
教材學習中的問題和解決過程, 一個問題加1分
代碼調試中的問題和解決過程, 一個問題加1分
6 其餘加分:
基於評分標準,我給本博客打分:XX分。得分狀況以下:xxx
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
B .
代碼容易編寫
C .
類型安全
D .
運行速度快
答案:AD
緣由:少選了C,看書看得仍是不夠仔細,只記住了大概。
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
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頁代碼如圖:
運行結果:
範例中有三個member實例,分別存儲爲文檔以後再讀取回來。
2.p325頁代碼以下:
運行結果:
這個是課本上最簡單的,也就是隻有一個流程,就是從main()開始至結束的流程。兔子可能隨機睡覺,運用了random函數。
這個是兔子的流程,從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); } } }
在這個程序中,主線程執行main()定義的流程,main()定義的流程中創建了tortoiseThread與hareThread兩個線程。要啓動線程執行指定流程,必須調用Thread()的start()方法。
3.p330代碼
使用了setDaemon(true)就是當前進程變爲後臺線程,對java來講,只要還有一個前臺線程在運行,這個進程就不會結束。
4.課本p331代碼:
這個程序能夠指定網頁下載東西,在每次for循環,進行HTTP請求,而後進行文檔寫入。可是效率很是的低下。
5.課本333頁代碼:
Thread。sleep()會讓線程進入Block狀態,若此時有其餘線程調用該線程的interrut()方法,會拋出異常對象,就會使線程「醒過來」。
6.p334頁代碼:
當線程使用join()加入另外一線程時,另外一線程會等待被加入的線程工做完畢,而後再繼續他的動做。程序啓動後,主線程開始,在主線程中新建threadB,並在啓動後,將至加入主線程中,因此會先執行B,主線程纔會繼續本來的流程。
7.在課本p337頁,uncaughtException()方法第一個參數可取的發生異常的線程實例,第二個參數可取得異常對象,運行結果顯示了線程的名稱及異常信息。
8.課本p338頁中,t1,t2都屬於同一個Threadgroup。t2沒有設定Thread。UncaughtExceptionHandler實例。因此有默認的第三個處理方式。
9.課本p344頁代碼以下:這個程序可能會發生死結,就是兩個線程都處於不放開resource鎖定的狀態,在死結髮生時陷入停頓狀態。
10.課本p345頁代碼:
運行以下:thread1會調用Variable1.one(),thread2會調用Variable1.two(),有可能會發生thread2調用取i值後,切換至thread1不斷執行,再切換至thread2取j值,有可能j遠大於i。
11.在課本p364-p366程序中,將Pages.java和DirectExecutor.java和Download.java按這個順序編譯後,運行結果下載了
12.課本p371代碼
使用了newSingleThreadScheduledExecutor()返回的SchduledExecutorService。java.util.Date建立時,回去的當時系統時間,每次工做會執行2秒,然後延遲1秒,因此如圖每三秒一個間隔。
13.課本p374頁,在繼承RecursiveTask以後,主要將子任務與求解過程撰寫於compute()方法中,爲了不分解出過多的子任務,形成沒必要要的麻煩,n< 20就直接用循環求解。
14.課本p376-p378頁代碼,使用了BlockingQueue的操做ArrayBlockingQueue類,這樣就不用處理麻煩的wait(),notify()流程了,簡化了不少。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 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就接近了。
計劃學習時間:25小時
實際學習時間:26小時