Android面試之線程和線程池

Android中的線程形態(tài)

  1. AsyncTask
    底層用到了線程池。AsyncTask封裝了線程池和Handler,它主要是為了方便開發(fā)者在子線程中更新UI。

AsyncTask內(nèi)的Handler是一個靜態(tài)的Handler對象,為了能夠?qū)?zhí)行環(huán)境切換到主線程,這就要求Handler這個對象必須在主線程中創(chuàng)建。由于靜態(tài)成員會在加載類的時候進行初始化,因此這就變相要求AsyncTask的類必須在主線程中加載,否則同一個進程中的AsyncTask都無法正常工作。

注意:從Android 3.0開始,默認情況下AsyncTask是串行執(zhí)行的。但在Android 3.0之前是并行執(zhí)行的。

  1. IntentService
    底層直接使用了線程,IntentService是一個服務,系統(tǒng)對其進行了封裝使其可以更方便地執(zhí)行后臺任務,IntentService內(nèi)部采用HandlerThread來執(zhí)行任務,當任務執(zhí)行完畢后IntentService會自動退出。

特殊的Service,它繼承了Service并且它是抽象類。IntentService可用于執(zhí)行后臺耗時的任務,當任務執(zhí)行后它會自動停止,同時由于IntentService是服務的原因,這導致他的優(yōu)先級比單純的線程要高很多,所以IntentService比較適合執(zhí)行一些高優(yōu)先級的后臺任務。

  1. HandlerThread
    底層直接使用了線程,HandlerThread是一中消息循環(huán)的線程,在它的內(nèi)部可以使用Handler。

HandlerThread繼承了Thread,它是一種可以使用Handler的Thread,它的實現(xiàn)很簡單,就在run方法中通過Looper.prepare()來創(chuàng)建消息隊列,并通過Looper.loop()來開啟消息循環(huán),這樣在實際的使用中就允許在HandlerThread中創(chuàng)建Handler。

Android中的線程池

  1. 線程池的優(yōu)點:
  • 重用線程池中的線程,避免因為線程的創(chuàng)建和銷毀所帶來的性能開銷。
  • 能有效控制線程池中的最大并發(fā)數(shù),避免大量的線程之間因為互相搶占系統(tǒng)資源而導致的阻塞現(xiàn)象。
  • 能夠?qū)€程進行簡單的管理,并提供定時執(zhí)行以及指定間隔循環(huán)執(zhí)行等功能。
  1. Android中的線程池的概念來源于Java中的Executor,Executor是一個接口,真正的線程池的實現(xiàn)為ThreadPoolExecutor。

ThreadPoolExecutor提供一系列參數(shù)來配置線程池,通過不同的參數(shù)可以創(chuàng)建不同的線程池,從線程池的功能特性來說,線程池主要分為4類。

ThreadPoolExecutor執(zhí)行任務時大致遵循以下規(guī)則:

  • 如果線程池中的線程數(shù)量未達到核心線程的數(shù)量,那么會直接啟動一個核心線程來執(zhí)行任務。
  • 如果線程中的線程數(shù)量已經(jīng)達到或者超過核心線程的數(shù)量,那么任務會被插入到任務隊列中排隊等待執(zhí)行。
  • 如果在步驟2中無法將任務插入到任務隊列中,這往往是由于任務隊列已經(jīng)滿了, 這個時候如果線程數(shù)量未達到線程池規(guī)定的最大值,那么會立刻啟動一個非核心線程來執(zhí)行任務。
  • 如果步驟3的中線程數(shù)量已經(jīng)達到線程池規(guī)定的最大值,那么就拒絕執(zhí)行此任務,ThreadPoolExecutor會調(diào)用RejectedExecutionHandler的rejectedExecution方法來通知調(diào)用者。
  1. 線程池主要有4類:
  • FixThreadPool:這是一種線程數(shù)量固定的線程池,當線程處于空閑的時候,并不會被回收,除非線程池被關閉了。
  • CachedThreadPool:這是一種線程數(shù)量不定的線程池,它只有非核心線程,并且最大線程數(shù)為Integer.MAX_VALUE。
  • ScheduledThreadPool:它的核心線程數(shù)量是固定的,而非核心線程數(shù)是沒有限制的,并且當非核心線程閑置時會被立即回收。
  • SingleThreadExecutor:這類線程池內(nèi)部只有一個核心線程,它確保所有的任務都在同一個線程中按順序執(zhí)行。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容