騰訊面試Android高級崗,居然被一個多線程基礎面倒了?


前言

一個在深圳從事開發五年的老友一個月前從原公司辭職后,昨天去騰訊總部面試Android高級崗,一面的時候,自我介紹后,陸陸續續問了很多問題,有着五年的從業經驗很多項目開發的技術問題都回答的很通順,面試官也很滿意,就在最后以為自己要順利通過時,【多線程——進程線程】,一個基礎問題一時沒有答上來就失去了二面的機會!

 
 

在我的身邊不止發生了這一個大廠面試被拒的例子,所以從他們的身上我有總結出一個特點,無論是大廠BAT之類還是中廠,在面試過程中是逃不掉各類的開發基礎問題,很多不注意的小細節正是打敗我們的關鍵!走出自己的技術圈子,基礎是必不可少的。

下面我分享一下我在TX官方群里收集的多線程面試專題,(更多大廠面試專題含答案文末一起分享)

1.什么是線程

線程就是進程中運行的多個子任務,是操作系統調用的最小單元

2.線程的狀態

New:新建狀態,new出來,還沒有調用start
Runnable:可運行狀態,調用start進入可運行狀態,可能運行也可能沒有運行,取決於操作系統的調度
Blocked:阻塞狀態,被鎖阻塞,暫時不活動,阻塞狀態是線程阻塞在進入synchronized關鍵字修飾的方法或代碼塊(獲取鎖)時的狀態。
Waiting:等待狀態,不活動,不運行任何代碼,等待線程調度器調度,wait sleep
Timed Waiting:超時等待,在指定時間自行返回
Terminated:終止狀態,包括正常終止和異常終止

3.線程的創建

a.繼承Thread重寫run方法
b.實現Runnable重寫run方法
c.實現Callable重寫call方法
實現Callable和實現Runnable類似,但是功能更強大,具體表現在
a.可以在任務結束后提供一個返回值,Runnable不行
b.call方法可以拋出異常,Runnable的run方法不行
c.可以通過運行Callable得到的Fulture對象監聽目標線程調用call方法的結果,得到返回值,(fulture.get(),調用后會阻塞,直到獲取到返回值)

4.線程中斷

一般情況下,線程不執行完任務不會退出,但是在有些場景下,我們需要手動控制線程中斷結束任務,Java中有提供線程中斷機制相關的Api,每個線程都一個狀態位用於標識當前線程對象是否是中斷狀態

public boolean isInterrupted() //判斷中斷標識位是否是true,不會改變標識位public void interrupt() //將中斷標識位設置為truepublic static boolean interrupted() //判斷當前線程是否被中斷,並且該方法調用結束的時候會清空中斷標識位

需要注意的是interrupt()方法並不會真的中斷線程,它只是將中斷標識位設置為true,具體是否要中斷由程序來判斷,如下,只要線程中斷標識位為false,也就是沒有中斷就一直執行線程方法

new Thread(new Runnable(){
while(!Thread.currentThread().isInterrupted()){
//執行線程方法
}
}).start();
前邊我們提到了線程的六種狀態,New Runnable Blocked Waiting Timed Waiting Terminated,那么在這六種狀態下調用線程中斷的代碼會怎樣呢,New和Terminated狀態下,線程不會理會線程中斷的請求,既不會設置標記位,在Runnable和Blocked狀態下調用interrupt會將標志位設置位true,在Waiting和Timed Waiting狀態下會發生InterruptedException異常,針對這個異常我們如何處理?
1.在catch語句中通過interrupt設置中斷狀態,因為發生中斷異常時,中斷標志位會被復位,我們需要重新將中斷標志位設置為true,這樣外界可以通過這個狀態判斷是否需要中斷線程
try{
....
}catch(InterruptedException e){
Thread.currentThread().interrupt();
}
2.更好的做法是,不捕獲異常,直接拋出給調用者處理,這樣更靈活

5.Thread為什么不能用stop方法停止線程

從SUN的官方文檔可以得知,調用Thread.stop()方法是不安全的,這是因為當調用Thread.stop()方法時,會發生下面兩件事:
1.即刻拋出ThreadDeath異常,在線程的run()方法內,任何一點都有可能拋出ThreadDeath Error,包括在catch或finally語句中。
2.釋放該線程所持有的所有的鎖。調用thread.stop()后導致了該線程所持有的所有鎖的突然釋放,那么被保護數據就有可能呈現不一致性,其他線程在使用這些被破壞的數據時,有可能導致一些很奇怪的應用程序錯誤。

6.重入鎖與條件對象,同步方法和同步代碼塊

7.volatile關鍵字

8.java內存模型

9.原子性 可見性 有序性

10.線程池ThreadPoolExecutor

11.線程池的種類

12.線程同步機制與原理,舉例說明

13.arrayList與linkedList的讀寫時間復雜度

14.為什么HashMap線程不安全(hash碰撞與擴容導致)

15.進程線程的區別

16.Binder的內存拷貝過程

17.傳統IPC機制的通信原理(2次內存拷貝)

18.Java內存模型(記住堆棧是內存分區,不是模型)

19.類的加載過程

20.什么情況下會觸發類的初始化

21.雙親委托模式

22.雙親委托模式的好處

23.死鎖的產生條件,如何避免死鎖

24.App啟動流程

25.Android單線程模型

26.RecyclerView在很多方面能取代ListView,Google為什么沒把ListView划上一條過時的橫線?

27.HashMap如何保證元素均勻分布

 
 

答案的篇幅過長,文中放進去不方便大家的閱讀,還是以文檔的形式看比較便於查看學習,有需要的朋友可以去加入那個騰訊的官方群,簡信我回復【資料】,里面不僅僅有Android各類專題面試資料,BAT高級源碼面試題,還有提供學習的系統進階視頻資料,現在面對找工作的困境,需要提升自己的朋友們推薦加入。

最后

大家所認知的,給程序員定義的標簽一定少不了“宅”這個字,那么 這個宅字我個人所理解的有兩層意思,第一就是像很多人所想象的愛宅在家和編程代碼過一輩子,第二種呢,就是盲目宅在自己的技術舒適區,眼界不寬,不能看到別人的長處,吸收別人的優點。雖然我不能得知這個宅字是不是真的能運用到所有人身上,但針對我這個老友,他,就是這樣。

 
 

 
日記本

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM