第十一章 Android的线程和线程池

一、线程池

1、什么是Android的线程池
Android中的线程池的概念来源于Java中的Executor,Executor是一个接口,真正的线程池的实现为ThreadPoolExecutor。ThreadPoolExecutor提供了一系列参数来配置线程池,通过不同的参数可以创建不同的线程池。
从线程池的功能特性上来说,Android的线程池主要分为4类,这4类线程池可以通过Executors提供的工厂方法来得到。

2、线程池的优点
1)重用线程池中的线程,避免因为线程的创建和销毁带来的性能开销;
2)能有效控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象;
3)能够对线程进行简单的管理,并提供定时执行及指定间隔循环执行等功能。

3、如何构建线程池
下图是ThreadPoolExecutor的一个比较常用的构造方法
第十一章 Android的线程和线程池
第十一章 Android的线程和线程池

4、线程池执行任务时遵循的规则
第十一章 Android的线程和线程池

5、Android中四类最常见的不同功能特性的线程池
第十一章 Android的线程和线程池
第十一章 Android的线程和线程池
这四种线程池的典型用法
第十一章 Android的线程和线程池

6、AsyncTask中的线程池
第十一章 Android的线程和线程池


二、AsyncTask

1、用法方法
第十一章 Android的线程和线程池

2、使用时的条件限制
第十一章 Android的线程和线程池

3、原理分析
AsyncTask中有两个线程池(SerialExecutor、THREAD_POOL_EXECUTOR)和一个Handler(InternalHandler),都是静态变量。
SerialExecutor用于任务的排队,THREAD_POOL_EXECUTOR用于真正的执行任务,InternalHandler用于将执行环境从线程池切换到主线程。
1)先看AsyncTask的execute()
第十一章 Android的线程和线程池
2)线程池执行execute()
第十一章 Android的线程和线程池
3)任务在线程池中被执行的过程
mFutureTask的run()最终会在线程池中被调用,而它又会调用mWorker的call(),所以最终mWorker
的call()会在线程池中被调用
第十一章 Android的线程和线程池
第十一章 Android的线程和线程池

第十一章 Android的线程和线程池

第十一章 Android的线程和线程池

第十一章 Android的线程和线程池

注:5.0的版本InternalHandler持有的是初始化AsyncTask的线程的Looper,而近来版本是明确的持有主线程的Looper,所以上面所说的只能在主线程初始化AsyncTask在近来版本是不成立的。


三、HandlerThread

普通Thread主要用于在run()中执行一个耗时任务,而HandlerThread在内部创建了一个消息队列,外界需要通过Handler的消息方式来通知HandlerThread来执行一个具体的任务。
由于HandlerThread的run()是一个无限循环,因此当明确不需要再使用HandlerThread时,可以通过它的quit或quitSafely方法来终止线程的执行。


四、IntentService

开一个普通线程执行耗时任务,如果此时进程位于后台,那么进程很容易被杀死;
如果将此任务放在Service里,进程在后台是不容易被杀死了,可是又不能执行耗时任务;
于是,IntentService就应运而生了。它可以很方便的执行后台高优先级耗时任务。
而且由下面的分析可以知道,它对任务的处理是串行的。

第十一章 Android的线程和线程池

第十一章 Android的线程和线程池

第十一章 Android的线程和线程池

第十一章 Android的线程和线程池