AsyncTask
类声明:public abstract class AsyncTask<Params, Progress, Result>
泛型参数释义:
Params - 表示参数类型
Progress - 表示后台进度类型
Result - 表示后台任务结束后的返回值类型
AsyncTask 提供了4个核心方法:
1.protected void onPreExecute() - 在UI线程执行,在异步任务执行之前,一般做初始化操作
2.protected abstract Result doInBackground(Params... params) - 在线程池中执行,参数为任务执行参数,此方法可以通过调用protected final void publishProgress(Progress... values)
方法更新任务进度,publishProgress方法会调用onProgressUpdate方法,此外此方法的计算结果要返回给onPostExecute
3.protected void onProgressUpdate(Progress... values),在主线程中执行,当后台任务进度发生变化时调用
- protected void onPostExecute(Result result) 在UI线程中执行,参数为doInBackground的返回值
AsyncTask方法执行顺序:onPreExecute->doInBackground->onPostExecute
doInBackground中调用publishProgress,则:onPreExecute->doInBackground->onProgressUpdate->onPostExecute
AsyncTask还提供了onCancelled方法,该方法也是在主线程执行,若调用了onCancelled,则onPostExecute方法不会执行
使用注意事项:
- AsyncTask必须在主线程使用 ,execute方法必须在主线程调用,AsyncTask对象必须在主线程声明
- 不要在程序中直接调用onPreExecute、doInBackground、onProgressUpdate、onPostExecute四个方法
- 一个AsyncTask对象只能执行一次,即execute只能调用一次
- AsyncTask在3.0之前是并行任务,之后是串行任务,不过仍然可以调用executeOnExecutor方法来并行执行任务,该方法在3.0之后新加的方法
ThreadPoolExecutor
ThreadPoolExecutor一共有四个构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
我们常用的一般为:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
参数释义:
corePoolSize----线程池的核心线程数,默认情况,核心线程会在线程池中一直存活,即使他们处于闲置状态。如果将线程池的allowCoreThreadTimeOut属性设置为Ture,那么闲置线程在等待新线程就会有超时策略,这个时间由keepAliveTime所指定,当时间超过keepAliveTime就会终止核心线程
maximumPoolSize----最大线程数,当线程到达这个数量,后续新线程会被阻塞。
keepAliveTime----非核心线程闲置时间,超过时长就会被回收,当allowCoreThreadTimeOut为true,同样作用于核心线程
unit -------枚举,指定keepAliveTime的时间单位
workQueue--------线程任务队列,通过线程池的execute方法提交的Runnable对象会存储在这个参数中
threadFactory--------线程工厂,为线程池创建新线程的功能,该接口只有一个方法:Thread newThread(Runnable r);
除了上面主要参数外,还提供一个RejectedExecutionHandler,当线程池无法执行新任务时,这由于线程池满,或者无法成功执行任务时,这时会调用Handler的rejectedExecution来通知调用者,默认会抛出RejectedExecutionException,线程池为RejectedExecutionHandler提供几个可选值:AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy,其中AbortPolicy就是默认值,他会直接抛出RejectedExecutionException
线程池执行任务时大致遵循如下规则:
(1) 线程池中线程数量未达到线程池核心线程数量,那就直接启动核心线程执行任务。
(2)达到、超过核心线程数量,任务会被插到任务队列等待执行
(3)如果步骤2无法插入队列,这往往由于队列已满,这个时候如果没有达到线程池最大线程数量,会立刻开启非核心线程执行。
(4)如果达到最大数量,那会拒绝任务,会调用RejectedExecutionHandler的rejectedExecution方法通知调用者
线程池的分类
通过Executors类使用默认配置的线程池,FixedThreadPool、CachedThreadPool、newScheduledThreadPool、SingleThreadExecutor。
网友评论