1. 程式人生 > 其它 >位元組跳動歷年Android中高階面試題全收錄,已拿offer

位元組跳動歷年Android中高階面試題全收錄,已拿offer

在很多的部落格或者書上,說有三種,除了上述的兩種以外,還有一種是實現Callable介面。但是這種並不是,因為,我們檢查JDK中Thread的原始碼,看它的註釋:

There are two ways to create a new thread of execution. One is to declare a class to be a subclass of Thread. This subclass should override the run method of class Thread. An instance of the subclass can then be allocated and started.

這裡面明確指出,只有兩種方式建立一個新執行緒執行,而且Thread類的構造方法裡,也沒有接受引數型別為Callable的方法。所以新啟執行緒的方式只有上述兩種。

Thread和Runnable的區別

我們知道Java是面向物件的語言,對於執行緒來說,這是作業系統層面的概念,那麼對於執行緒來說,Thread和Runnable誰才是執行緒呢?

要注意,Thread才是Java裡對執行緒的唯一抽象,Runnable只是對任務(業務邏輯)的抽象。Thread可以接受任意一個Runnable的例項並執行。用一個生活中的例子來說明,一個開發部門中有很多的開發人員,每個開發人員都可以開發程式,這樣,每個開發人員就是一個個的Thread,而開發人員接收到的開發任務就是一個個的Runnable,開發人員是做實際開發工作的,不同的開發人員完全可以接受同一個開發任務。

深入理解run()和start()

同時,我們通過new Thread()其實只是new出一個Thread的例項,還沒有作業系統中真正的執行緒掛起鉤來。只有執行了start()方法後,才實現了真正意義上的啟動執行緒。

start()方法讓一個執行緒進入就緒佇列等待分配CPU,分到CPU後才呼叫實現的run()方法,start()方法不能重複呼叫,如果重複呼叫會丟擲IllegalThreadStateException異常。

而run方法是業務邏輯實現的地方,本質上和任意一個類的任意一個成員方法並沒有任何區別,可以重複執行,也可以被單獨呼叫。

執行緒的狀態

Java中執行緒的狀態也不是簡單的只有執行和死亡,共分為6種:

  1. 初始(NEW):新建立了一個執行緒物件,但還沒有呼叫start()方法。

  2. 執行(RUNNABLE):Java執行緒中將就緒(ready)和執行中(running)兩種狀態籠統的稱為“執行”。

執行緒物件建立後,其他執行緒(比如main執行緒)呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,等待被執行緒排程選中,獲取CPU的使用權,此時處於就緒狀態(ready)。就緒狀態的執行緒在獲得CPU時間片後變為執行中狀態(running)。

  1. 阻塞(BLOCKED):表示執行緒阻塞於鎖。

  2. 等待(WAITING):進入該狀態的執行緒需要等待其他執行緒做出一些特定動作(通知或中斷)。

  3. 超時等待(TIMED_WAITING):該狀態不同於WAITING,它可以在指定的時間後自行返回。

  4. 終止(TERMINATED):表示該執行緒已經執行完畢。

理解了執行緒的狀態才能更好的讓我們在併發程式設計除錯程式時,知道執行緒的工作情況,進而有針對性的檢查我們的程式碼的執行情況,進一步優化我們的程式碼。

【附】相關架構及資料

往期Android高階架構資料、原始碼、筆記、視訊。高階UI、效能優化、架構師課程、NDK、混合式開發(ReactNative+Weex)微信小程式、Flutter全方面的Android進階實踐技術,群內還有技術大牛一起討論交流解決問題。

本文已被CODING開源專案:《Android學習筆記總結+移動架構視訊+大廠面試真題+專案實戰原始碼》收錄