1.主线程和子线程
11.2Android中的线程形态
11.2.1 AsyncTask
AsyncTask 是一个抽象的泛型类,他提供了Params,Progress和Result三个泛型参数
Async提供了4个核心方法
1.onPreExecute() 2.doInbackGround() 3.onProgressUpdate() 4.onPostExecute
11.2.2AsyncTask的工作原理
11.2.3 HandlerThread
HandlerThread继承了Thread,他是一个可以使用handler的Thread
在run方法中通过Looper.prepare()来创建消息队列,并通过Looper.loop()来开启消息循环。这就在实际实际使用中允许在handlerThread中创建handler。
11.2.4IntentService intentService是一种特殊的Service,它继承了Service并且他是一个抽象类,所以必须创建它的子类才能使用IntentService。IntentService可用于执行后台耗时的任务,当任务执行后他自动停止。在实现上IntentService封装了handlerThread和handler
当intentService被第一次启动时,他的increase方法会被调用,onCreate方法会创建一个handlerThread,然后使用它的Looper来构造一个Handler对象mServiceHandler,这样通过mServicehandler发送的消息最终都会在HandlerThread中执行,从这个角度来说,IntentService也可以用于执行后台任务。每次启动intentService,它的onStartCommend方法就会调用一次。IntentService仅仅是通过mServiceHandler发送一个消息,这个消息在handlerThread中被处理。mServiceHandler收到消息后,会将Intent对象传递给OnhandlerIntent方法去处理
11.3 Android中的线程池
好处
1.重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销
2.能有效控制线程池中的最大并发数,避免大量的线程之间因为互相抢占系统资源而导致的阻塞现象
3.能够对线程进行简单的管理,并提供定时执行以及制定间隔循环执行等功能
11.3.1 ThreadPoolExecutor
threadPoolExecutor是线程池真正实现,他的构造方法提供了一系列参数来配置线程池
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory)
corePoolSize 线程的核心线程数
maximumPoolSize 线程池所能容纳的最大线程数
keepAliveTime 非核心线程闲置时的超时时长
unit 用来是定keepAliveTime参数的时间单位
workQueue 线程池中的任务队列
threadFactory 线程工厂,为线程池提供新线程的功能
11.3.2线程池分类
1.FixedThreadPool 线程数量固定的线程池,当线程处于空闲状态时,他们并不会被回收
2.CachedThreadPool 他是一种线程数量不定的线程池,他只有非核心线程,最大线程数量是Integer.MAX_VALUE
3.ScheduledThreadPool 他的核心线程数量是固定的,而非核心线程数是没有限制的。并且当非非核心线程闲置时会被立刻回收。ScheduledThreadPool这类线程池主要用于执行定时任务和具有固定周期的重复任务
4.singleThreadExecutor 内部只有一个核心线程,他确保所有的任务都在用一个线程中按顺序执行。