Android的线程和线程池

Android中的线程形态

包括了Thread、AsyncTask、HandlerThread以及IntentService四种

AsyncTask

一种轻量级的异步任务类,在线程池中执行后台任务,然后把执行进度和结果传递给主线程并在主线程中更新UI。
是一个抽象的泛型类,提供了三个泛型参数:Params、Progress和Result,Params表示传递的参数的类型,Progress表示后台任务执行进度的类型,Result表示后台任务返回结果的类型,如果不需要传递具体的参数,则可以用Void代替这三个参数

四个核心方法

1.onPreExecute(),在主线程中执行,在异步任务执行之前被调用,可用于做一些准备工作
2.doInBackground(Params…params),在线程池中执行,用于执行异步任务,params表示异步执行输入的参数,该方法可以通过publishProgress方法来更新任务进度,publishProgress会调用onProgressUpdate,最后返回计算结果给onPostExecute方法
3.onProgressUpdate(Progress…values),在主线程中执行,当后台任务的执行进度发生改变时会调用此方法
4.onPostExecute(Result result),在主线程中执行,在异步执行之后,会被调用,result表示后台任务返回的结果,即doInBackground的返回值
onCancelled,在主线程中执行,在异步执行被取消时被调用,这时onPostExecute不会被调用

执行顺序:onPreExecute—>doInBackground—>onPostExecute
限制条件

1.AsyncTask的类必须在主线程中加载,意味着第一次访问AsyncTask必须发生在主线程中
2.AsyncTask的对象必须在主线程中创建
3.execute必须在UI线程调用
4.不要直接在程序中直接使用onPreExecute、doInBackground、onProgressUpdate、onPostExecute方法
5.一个AsyncTask对象只能执行一次,即只能执行一次execute,否则会报运行时异常
6.Android 1.6之前采用串行执行任务,1.6之后采用线程池里处理并行任务,3.0以及之后可以通过executeOnExecutor来并行执行任务

AsyncTask中有两种线程池(SerialExecutor和THREAD_POOL_EXECUTOR),另一个是Handler(InternalHandler),SerialExecutor线程池用于任务的排队,THREAD_POOL_EXECUTOR线程池用于真正的执行任务,InternalHandler用于将线程池切换到主线程
executeOnExecutor方法可以让Android 3.0及以上的版本并行,executeOnExecutor是Android3.0新添加的

HandlerThread

可以使用Handler的Thread,实现:run—>Looper.prepare()(创建消息队列)—>Looper.loop()(开启循环)

IntentService

用于执行后台耗时任务,任务结束后会自动停止,因为是服务,优先级比单纯的线程高,适合执行优先级高的后台任务,封装了HandlerThread和Handler
onCreate()—>创建HandlerThread—>使用Looper构建Handler对象
IntentService—>通过mServiceHandler发送消息—>HandlerThread处理消息–》->将Intent对象传递到onHandlerIntent中处理—>结束后通过stopSelf(int startId)尝试停止服务

线程池

优点:
1.重用线程池中的线程,避免因线程的创建和销毁带来性能的开销
2.能有效控制线程池中最大并发数,避免线程之间因抢占系统资源而导致阻塞现象
3.能够对线程进行简单的管理,并提供定时执行以及指定时间间隔执行等功能
ThreadPoolExecutor
线程池的真正实现,构造方法提供一系列参数来配置线程池

public ThreadPoolExecutor(
    int corePoolSize,
    int maximunPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory)

corePoolSize:线程池的核心线程数
maximunPoolSize:线程池所能容纳的最大线程数,超过会发生阻塞
keepAliveTime:非核心线程限值时的超时时长,超过会被回收
unit:单位
workQueue:任务队列,通过execute提交的Runnable对象存储在在理
threadFactory:线程工厂,为线程提供创建新线程的功能

线程池的分类

FixedThreadPool、CachedPool、ScheduledThreadPool和SingleThreadPool

FixedThreadPool:线程数量固定的线程池,线程空闲时不会被回收除非被关闭了,可以更快的响应外界请求,只用核心线程,并且没有超时机制,另外任务队列也没有限量;

CachedPool:只用非核心线程,并且最大线程数量为Integer.MAX_VALUE几乎为无限大,有超时机制,超时就会被回收被停止,几乎不占用系统资源;

ScheduledThreadPool:有固定数量的核心线程,非核心线程没有限制,空闲时会被立即回收,主要用于执行定时任务和具有固定周期的重复任务;

SingleThreadPool:内部只有一个核心线程确保所有任务在同一个线程中按顺序执行,在于统一所有外界任务到同一个线程中,好处是这些任务不需要处理线程同步的问题。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页