AsyncTask和線程池

這篇文章還是根據《android藝術開發探索》的筆記

AsyncTask封裝了線程池和handler

主線程的作用是運行四大組件以及處理他們和用戶的交互

AsyncTask必須在主線程中加載,execute方法必須運行在Ui線程中,一個AsyncTask對象只能執行依次,也就是只能調用一次execute方法。

AsyncTask的工作原理:先從他的execute方法開始,他會調用executeOnExecutor方法,并給它傳遞一個串行的Executor(SerialExecutor),然后將參數封裝為FutureTask對象,他是一個并發類,充當Runnable的作用,在execute里面最先執行onPreExecute方法,然后將FutureTask對象通過SerialExecutor的對象的execute方法傳遞進來,在這里面,首先會把FutureTask對象插入到mTasks中,如果當前沒有AsyncTask任務,就執行下一個任務,從這可以充分看出,默認情況下AsyncTask.execute()是串行的。

AsyncTask有兩個線程池,SerialExecutoe和THREAD_POOL_EXECUTOR,還有一個Handler(InternalHandler),SerialExecutoe是用于任務的排隊的,而THREAD_POOL_EXECUTOR是真正執行任務的,而InternalHandler是將執行的環境從線程池切換到主線程。怎么切換的呢?上面說到FutureTask在任務棧里面,在SerialExecutor.execute()中會調用FutureTask的run()方法,在run中又會調用mWorker的call方法,call最終會在線程池中執行,在call中,會通過Message將result發送出去,會在IntermalHandler中handleMessage方法中收到Message,而IntermalHandler是靜態對象,就必須要求在主線程中創建。如果收到MESSAGE_POST_RESULT消息后,就會調用AsyncTask的finish方法,在這里有一個小邏輯,但是有大作用,首先會判斷isCancelled,true就會調用onCancelled方法,false就會調用onPostExecute方法,也就是說? run完了以后才會調用這兩個方法,然后在中間取消的話,僅僅就是不調用onPostExecute方法。

最后聲明一下,android在3.0之前是并行的線程,之后就是串行的,當然也可以調用executeOnExecutor方法也可以實現并行。

HandlerThread:是一種可以使用handler的Thread,就是在run方法中通過Looper.prepare方法來創建消息隊列,并通過Looper.loop()來開啟消息循環。由于HandlerThread的run是一個無限循環,因此不需要的時候,就把他quit或者quitSafely終止掉。

IntentService:是一種特殊的Service,可用以執行耗時的后臺任務,由于它是Service,所以他的優先級比單純的線程要高。

線程池:優點(1)重用線程池中的線程,避免線程的創建和銷毀所帶來的性能開銷(2)能有效的控制線程池的最大并發數,避免大量線程之間搶占資源而導致的阻塞現象(3)能夠對線程進行簡單的管理,并能提供定時執行以及指定間隔循環等功能

ThreadPoolExecutor是線程池的實現類,他的構造函數的參數有好多個,在這就大概介紹一下吧,corePoolSize 代表的是線程池的核心線程數,默認情況下,他會一直存活下去,如果ThreadPoolExecutor的屬性allowCoreThreadTimeOut設置為true的話,他就和非核心線程一樣了,就有了超時策略。如果超過了keepLive的時間的話,coreThread就會被終止。

maximumPoolSize代表的是 最大線程數,當活動線程達到這個數值之后,后續的新任務就會被阻塞

keeoAliveTime 代表的是非核心線程閑置的超時時長,allowCoreThreadTimeOut設置為true的話,核心線程也會被收回。

unit 指定keepAliveTime參數的時間單位,這是一個枚舉類型。

threadFactory:線程工廠,為線程池提供創建新線程的功能,它是一個接口

這兒有一個現象:當核心線程都在執行任務的時候,如果再來一個任務,他不會創建非核心線程來執行,而是把他們加到任務隊列里,然后等待核心線程。如果任務隊列滿了以后,他才會創建非核心線程。

線程池的分類有四種,分別為FixedThreadPool? CashedThreadPool? ScheduledThreadPool? 以及SingleThreadExecutor? 具體可以查看網上的資料。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容