Android面試筆記總結(一)

有總結的工作纔有意義,有總結的人生纔會有進步。
本系列面試筆記所有問題,源自面試過程中的記錄總結,主要涉及Java和Android,但是由於面試過程中任何問題都有可能被問到,所以也會涉及一些其他方向的知識。部分答案參考網上朋友的文章,如有錯誤之處,歡迎批評指正。奮鬥

這篇筆記主要記錄了在Java多線程編程方面被問到的一些問題。

1 簡述一下線程和進程之間的關係?

答:線程是程序執行的基本單元。一個進程包含了很多個線程。在內存方面,進程與進程之間不共享內存,同一個進程的多個線程可以共享分配給這個進程的內存空間。每一個線程還擁有一個自己的內存空間,這段內存空間就是傳說中的線程棧,線程棧是在建立線程時由系統分配,主要用來保存線程內部所使用的數據。

2 java程序建立一個線程的形式有幾種?各有什麼好處?

答:Java程序建立線程一般有兩種方式,第一種就是繼承Thread類,第二種方法就是實現Runnable接口。這兩種方法沒有什麼好壞之分,都可以創建一個子線程。之所以有這兩種方法時因爲java語言特點是不允許存在多繼承的,當一個程序已經擁有了父類,就不可以在繼承Thread類來實現多線程,這時

就要通過實現Runnable接口來實現多線程。

3 終止一個線程的方法有哪些?

答:I 使用退出標誌,使線程正常退出,也就是run()方法運行結束自動退出。

    II 使用stop()方法強制退出,終止線程。(不推薦使用)

    III 使用interrupt()方法中斷線程。 

4 線程中join()方法的作用是什麼?

答:join()方法的功能就是使異步執行的線程變成同步執行。例如:

thread.start();
thread.join();
System.out.print("只有thread執行完才輸出這句");

5 sleep()和wait()方法的區別是什麼?

答:sleep()是線程類的靜態方法。wait()和notify()是object類的方法。對於程序中的每一個對象可以使用一個機鎖來控制這個對象的同步訪問。synchronized這個關鍵字可以和對象的鎖進行交互,來實現線程的同步訪問。由於sleep()方法時Thread類的方法,他不能改變對象鎖的狀態(只有object類的方法才能改變),所以當調用sleep()方法時,雖然線程休眠了,放棄了對cpu的使用,但是這個線程擁有的共享資源對象沒有被釋放(因爲鎖的狀態沒變),其他線程仍無法使用這個休眠線程佔用的共享對象資源。而wait方法會在線程休眠的同時釋放共享的資源對象(因爲wait方法時object類的方法,可以改變對象鎖的狀態),其他線程可以訪問該對象。

值得注意的是:sleep是Thread類的靜態方法,只能是自己的線程進行休眠,在線程A中調用B.sleep()不會使B線程休眠,會使線程A休眠。並且線程在被激活後不能馬上就運行,而是進入線程的就緒隊列進行等待CPU的調度。另外,wait()方法只能在synchronized塊中被調用,而sleep()不需要。

6 wait()和notify()方法之間的聯繫?

答:當一個線程執行到wait()方法時(線程休眠且釋放共享對象的對象鎖),它就進入了一個和該線程使用的共享資源對象有關的等待池中等待被喚醒。當它被notify()方法喚醒時,等待池中的對象就會獲得共享資源對象的鎖,當被cpu再次調度時,就會重新返回wait()方法中斷前的中斷現場。

7 談談對線程interrupt()方法的理解。

答:如果線程A希望線程B立刻結束,則可以對線程B對應的線程實例調用interrupt()方法。如果此時線程B正處於sleep/wait/join的狀態,則線程B會立刻拋出InterruptedException異常,在catch塊中捕獲這個異常,然後return即可安全退出,B線程運行結束。

值得注意的是:InterruptedException異常是線程自己從內部拋出的,並不是interrupt方法拋出的。對一個線程使用Interrupt方法時,如果這個線程正在執行普通代碼,則線程不會拋出InterruptedException異常,但是當這個線程再次運行到sleep/wait/join方法時,就會立刻拋出InterruptedException異常。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章