常见的线程形态
AsyncTask:不适合特别耗时的后台任务,耗时使用线程池。
必须在主线程中加载。
Android3.0以后是串行执行的,3.0以前是并行。
HanderThread:继承了Thread,是一种可以使用Handler的Thread,和普通的Thread的区别是在run方法中可通过Looper.prepare创建消息队列。
并通过Looper.loop()来开启消息循环。
IntentService:抽象类,适合执行高优先级 后台任务。
每执行一个后台任务就必须启动一次IntentService,内部则通过消息的方式向HanderThread请求执行任务,Handler中的Looper是顺序
处理消息的,所以IntentService也是顺序执行后台任务的,当有多个后台任务同时存在时,后台任务会按照外界发起的顺序排队执行。
线程池ThreadPoolExecutor
优点:
1、重用线程中的线程避免因为线程的创建和销毁所带来的性能开销;
2、能有效控制线程池最大并发数,避免大量的线程之间因互相抢占资源导致阻塞;
3、对线程进行管理,提供定时执行以及指定间隔循环执行等功能。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
corePoolSize:核心线程数
maximumPoolSize:线程池所容纳最大线程数
keepAliveTime:非核心线程闲置超时时长,超过非核心线程会被回收。
unit:keepAliveTime的参数时间单位
workQueue:线程池中任务队列,线程池execute方法提交的Runnable对象会存储在这个参数中
threadFactory:为线程池提供创建新线程的功能;
如果线程数量已达线程池规定的最大值,拒绝执行任务,并调用RejectedExecutionHandler的rejectedExecution通知调用者。
分类:
1、FixedThreadPool
线程数量固定的线程池,线程处于空闲状态时不会被回收,能够快速相应外接请求。只有核心进程。
2、CachedThreadPool
线程数量不定只有非核心进程的线程池,线程空闲有超时机制,超过会被回收。适合执行大量的耗时较少任务。
3、ScheduledThreadPool
核心线程数量固定,非核心线程数没有限制,当非核心进程闲置时会被回收。用于执行定时任务和具有固定周期的重复任务。
4、SingleThreadExecutor
只有一个核心进程,确保所有任务在同一个线程中按顺序执行(FIFO执行);