前一段時間在協(xié)同開發(fā)一個應(yīng)用,,打開最終提交的項目文件發(fā)現(xiàn)里面Activity,service這種組件類在所有類文件所占比例不過40%,,其余的都是輔助組件的類,,其中很大一部分是線程。Android應(yīng)用啟動時會自動打開主線程也就是UI線程,,activity和service這種組件都運行在主線程中,。但是主線程對反應(yīng)時間有嚴格的限制,停滯超過5秒就會報ANR異常,,因此復(fù)雜的耗時的邏輯不能寫在主線程中,,這也就是開發(fā)中為什么會有很多線程存在的原因,因為需要很多子線程去完成應(yīng)用本身的業(yè)務(wù)邏輯,。 在adb使用‘top -t’ 命令查看手機存在的線程,,發(fā)現(xiàn)每個應(yīng)用在運行并被用戶操作后后臺會產(chǎn)生大量的線程,我整理了多個應(yīng)用線程信息,,下面對線程進行簡單的分類: 一 AsyncTask android的異步任務(wù)類,,方便開發(fā)人員更容易的把后臺線程執(zhí)行結(jié)果反饋給UI,在SDK對它的說明中提到:AsyncTask是一個對Thread和Handler的輔助類,,沒有完整的線程框架, 最理想的使用場景是針對簡短的后臺操作,,當存在復(fù)雜和耗時的操作推薦使用Executor, ThreadPoolExecutor, FutureTask。它沒有完整的線程框架,那為什么我會把它放在線程類別中呢,,原因是我在命令行中查看線程時AsyncTask作為一個獨立的分類,,如下圖所示。
二 Executor 根據(jù)AsyncTask API的推薦,,我們順著往下找,。Executor是Java中的類,它的實現(xiàn)可以包含Thread或Runnable 線程的動作,。Executor本身是并發(fā)編程框架,,并發(fā)編程的一種編程方式是把任務(wù)拆分為一些列的小任務(wù),即Runnable,,然后在提交給一個Executor執(zhí)行,。Executor在執(zhí)行時使用內(nèi)部的線程池完成操作。Executor在客戶端和任務(wù)執(zhí)行之間提供了一個間接層,;與客戶端直接執(zhí)行任務(wù)不同,,這個中介對象將執(zhí)行任務(wù)。Executor允許開發(fā)人員管理異步任務(wù)的執(zhí)行,,而無需顯示的管理線程的生命周期,。 經(jīng)過實驗,程序中使用Executor在后臺會顯示的線程名稱是(如下圖所示): ThreadPoolExecutor ThreadPoolExecutor是Java中的類,,它 實現(xiàn)了一個hread pool,。Thread pool一般被用來解決兩個問題:當處理大量的同步task的時候,它能夠避免thread不斷創(chuàng)建銷毀的開銷,;而另外一個也許更重要的含義是,,它其實表示了一個boundary,通過使用thread pool可以限制這些任務(wù)所消耗的資源,比如最大線程數(shù),,比如最大的消息緩沖池,。 實驗表明,程序中使用ThreadPoolExecutor在后臺會有如下顯示:
FutureTask Java中的類,,SDK中對它的解釋是:它是一個可以被取消的異步類,;也就是它有start和cancel操作,其實上面的三種線程也都有對應(yīng)的關(guān)閉操作,,只是有些可能不需要開發(fā)人員來管理,。 三 Timer Timer是一個定時器,定時觸發(fā)相應(yīng)的動作,。 四 多線程下載文件 這個實現(xiàn)過程會用到基本的Thread類,,在后臺顯示
五 其他線程(不是開發(fā)人員手動啟動的線程) WebViewCoreThread:是應(yīng)用解析html會自動開啟的線程 CookieSyncManager:用來保證內(nèi)存和硬盤的數(shù)據(jù)一致性,估計是在使用SharePreference時自動啟動的線程,。 FileObserver: 是一個用來對文件或者文件夾監(jiān)聽的類,,看android源碼能看到這個類內(nèi)部起了一個ObserverThread線程,。 RefQueueworker:當對象引用處在隊列中時,GC過程會啟動這個線程 那除了上述開發(fā)人員在程序中直接或間接啟動的線程,,還包括DVM啟動自帶的線程,,因為每個應(yīng)用都有一個DVM,所以在后臺觀察發(fā)現(xiàn)所有的應(yīng)用都包含以下幾個線程,,這些線程應(yīng)該就是DVM自帶的線程:
推薦文章:http://www./topic/1118660 參考文獻:http://baike.baidu.com/view/2045577.htm http://blog.csdn.net/historyasamirror/article/details/5961368 |
|