探討 Android Threading Performance — Part 1 ( Thread 執行緒的概念)

York
4 min readJul 3, 2018

--

Thread 究竟負責做什麼 ?

從上圖可看出,Thread 從頭到尾只做三件事,開始、做工作、結束,更詳細一點來說,Thread 開始時會有 loop 運行在 Thread 上面,loop 能從 WorkQueue 中將一些工作拉進來執行,另一方面也需要從其他的 Thread 不斷推進工作到 WorkQueue,如此便能保持 Thread 持續存活。

Thread 的運作原理

Android 提供一些 class 來幫助我們處理這些細節,例如 Looper (又稱作 Event Loop),會保持 Thread 活著並且從 MessageQueue 提取工作到 Thread 上執行。另外 Looper 的特性是只能從 queue 的尾端推進工作。

Looper 運作原理

除了 Looper 以外,還有個類似的 Handler class。它與 Looper 不同之處在於 能從 queue 的頭、尾端推進工作,另外還能設定延遲時間來決定工作要隔多久才被處理。

前面所講到的工作被定義成幾種單位:Intent, Runnable, Message。使用哪種單位取決於由誰宣告及使用( Looper or Handler )。

在本文最後會簡單介紹一些將工作排程建立 Thread 結合在一起的幾種 class,但在介紹使用 HandlerThread 之前我們先來看看 APP 的 Main Thread。

常聽到的 Main Thread 都做了什麼事呢?

當使用者啟動 APP 時,Android 會建立自己的 Linux process ,伴隨著這個 process,系統建立一個專門執行 APP 的 Thread,這個 Thread 就是我們俗稱的 Main Thread,它本身就是一個 Handler Thread。Main Thread 處理所有遍及整個 APP 的事件,例如和生命週期相關的 callback: onCreate(), onStart(), onDestory(),或是輸入事件的 callback ,甚至是從其他 APP 傳來的事件等等。

從下圖可看出我們想要運行的程式碼都必須推進 Work Queue,代表 Main Thread 要處理非常多的工作,這也是為何我們必須將要花較長時間處理的工作交由其他的 Thread 來處理,以免這些耗時工作妨礙繪製 UI ( Rendering ) 的工作。

另開 Thread 執行耗時工作的幾種方案

在知道要避免在 Main Thread 執行耗時工作之後,我們必須使用先前提到能夠將工作排程建立 Thread 結合在一起的 class。有以下幾種選擇能夠使用:

這邊我只針對使用過的 AsyncTask, HandlerThread, IntentService 做介紹。首先 AsyncTask 特色在於能將背景工作及更新 UI 的程式碼區分開來,而 HandlerThread 則是能夠直接建立一個新的 Thread 上執行的 Handler。 IntentService 則是一種在新的 Thread 上執行的 Service,且當工作結束後會自行關閉。

並沒有能夠在任何情況下,都適用的類別能用,在哪種情境要使用相對適合的類別也需要一點經驗,今後有機會在針對這三種開啟新 Thread ,執行耗時工作的類別做介紹。

參考影片連結: https://www.youtube.com/watch?v=qk5F6Bxqhr4&index=1&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE

--

--