前一段时间在协同开发一个应用,打开最终提交的项目文件发现里面Activity,service这种组件类在所有类文件所占比例不过40%,其余的都是辅助组件的类,其中很大一部分是线程。Android应用启动时会自动打开主线程也就是UI线程,activity和service这种组件都运行在主线程中。但是主线程对反应时间有严格的限制,停滞超过5秒就会报ANR异常,因此复杂的耗时的逻辑不能写在主线程中,这也就是开发中为什么会有很多线程存在的原因,因为需要很多子线程去完成应用本身的业务逻辑。
在adb使用‘top -t’ 命令查看手机存在的线程,发现每个应用在运行并被用户操作后后台会产生大量的线程,我整理了多个应用线程信息,下面对线程进行简单的分类:
一 AsyncTask
android的异步任务类,方便开发人员更容易的把后台线程执行结果反馈给UI,在SDK对它的说明中提到:AsyncTask是一个对Thread和Handler的辅助类,没有完整的线程框架, 最理想的使用场景是针对简短的后台操作,当存在复杂和耗时的操作推荐使用Executor, ThreadPoolExecutor, FutureTask。它没有完整的线程框架,那为什么我会把它放在线程类别中呢,原因是我在命令行中查看线程时AsyncTask作为一个独立的分类,如下图所示。
二 Executor
根据AsyncTask API的推荐,我们顺着往下找。Executor是Java中的类,它的实现可以包含Thread或Runnable 线程的动作。Executor本身是并发编程框架,并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行。Executor在执行时使用内部的线程池完成操作。Executor在客户端和任务执行之间提供了一个间接层;与客户端直接执行任务不同,这个中介对象将执行任务。Executor允许开发人员管理异步任务的执行,而无需显示的管理线程的生命周期。
经过实验,程序中使用Executor在后台会显示的线程名称是(如下图所示):
ThreadPoolExecutor
ThreadPoolExecutor是Java中的类,它 实现了一个hread pool。Thread pool一般被用来解决两个问题:当处理大量的同步task的时候,它能够避免thread不断创建销毁的开销;而另外一个也许更重要的含义是,它其实表示了一个boundary,通过使用thread pool可以限制这些任务所消耗的资源,比如最大线程数,比如最大的消息缓冲池。
实验表明,程序中使用ThreadPoolExecutor在后台会有如下显示:
FutureTask
Java中的类,SDK中对它的解释是:它是一个可以被取消的异步类;也就是它有start和cancel操作,其实上面的三种线程也都有对应的关闭操作,只是有些可能不需要开发人员来管理。
三 Timer
Timer是一个定时器,定时触发相应的动作。
四 多线程下载文件
这个实现过程会用到基本的Thread类,在后台显示
五 其他线程(不是开发人员手动启动的线程)
WebViewCoreThread:是应用解析html会自动开启的线程
CookieSyncManager:用来保证内存和硬盘的数据一致性,估计是在使用SharePreference时自动启动的线程。
FileObserver: 是一个用来对文件或者文件夹监听的类,看android源码能看到这个类内部起了一个ObserverThread线程。
RefQueueworker:当对象引用处在队列中时,GC过程会启动这个线程
那除了上述开发人员在程序中直接或间接启动的线程,还包括DVM启动自带的线程,因为每个应用都有一个DVM,所以在后台观察发现所有的应用都包含以下几个线程,这些线程应该就是DVM自带的线程:
推荐文章:http://www.iteye.com/topic/1118660
参考文献:http://baike.baidu.com/view/2045577.htm
http://blog.csdn.net/historyasamirror/article/details/5961368
转载:http://blog.csdn.net/heyetina/article/details/8256165