android开发艺术探索第十一章心得(android的线程和线程池)

ThreadPoolExecutor

ExecutorService是最初的线程池接口,ThreadPoolExecutor类是对线程池的具体实现,它通过构造方法来配置线程池的参数,我们来分析一下它常用的构造函数吧。

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}

参数解释:
corePoolSize,线程池中核心线程的数量,默认情况下,即使核心线程没有任务在执行它也存在的,我们固定一定数量的核心线程且它一直存活这样就避免了一般情况下CPU创建和销毁线程带来的开销。我们如果将ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true,那么闲置的核心线程就会有超时策略,这个时间由keepAliveTime来设定,即keepAliveTime时间内如果核心线程没有回应则该线程就会被终止。allowCoreThreadTimeOut默认为false,核心线程没有超时时间。
maximumPoolSize,线程池中的最大线程数,当任务数量超过最大线程数时其它任务可能就会被阻塞。最大线程数=核心线程+非核心线程。非核心线程只有当核心线程不够用且线程池有空余时才会被创建,执行完任务后非核心线程会被销毁。
keepAliveTime,非核心线程的超时时长,当执行时间超过这个时间时,非核心线程就会被回收。当allowCoreThreadTimeOut设置为true时,此属性也作用在核心线程上。
unit,枚举时间单位,TimeUnit。
workQueue,线程池中的任务队列,我们提交给线程池的runnable会被存储在这个对象上。

线程池的分配遵循这样的规则:
当线程池中的核心线程数量未达到最大线程数时,启动一个核心线程去执行任务;
如果线程池中的核心线程数量达到最大线程数时,那么任务会被插入到任务队列中排队等待执行;
如果在上一步骤中任务队列已满但是线程池中线程数量未达到限定线程总数,那么启动一个非核心线程来处理任务;
如果上一步骤中线程数量达到了限定线程总量,那么线程池则拒绝执行该任务,且ThreadPoolExecutor会调用RejectedtionHandler的rejectedExecution方法来通知调用者。
实现:

ExecutorService cachedThreadService= Executors.newCachedThreadPool();
ExecutorService fixedThreadService=Executors.newFixedThreadPool(1);
ExecutorService scheduleThreadService=Executors.newScheduledThreadPool(1);
ExecutorService singleThreadService=Executors.newSingleThreadExecutor();

HandlerThread和IntentService

HandlerThread继承了Thread,里面的run方法提供了一套消息机制,创建了Looper,IntentService里维护了一个HandlerThread成员,并且还有配套的Handler,即ServiceHandler.
IntentService可用于执行后台耗时操作任务,当任务执行后会自动停止,同时由于IntentService是服务的原因,导致它的优先级比单纯的线程要高很多,不容易被系统杀死.所以IntentService比较适合执行一些优先级高的后台异步任务.
IntentService用法:
继承IntentService,实现OnhandleIntent(Intent intent)方法,通过startService(intent)启动,在其内部就是普通的Handler发送消息机制,最终在OnhandleIntent(Intent intent)处理.
IntentService的目的是在后台执行异步操作.

你可能感兴趣的:(android开发艺术探索第十一章心得(android的线程和线程池))