Android中的线程

AsyncTask

类声明:public abstract class AsyncTask
泛型参数释义:
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),在主线程中执行,当后台任务进度发生变化时调用

  1. protected void onPostExecute(Result result) 在UI线程中执行,参数为doInBackground的返回值

AsyncTask方法执行顺序:onPreExecute->doInBackground->onPostExecute

doInBackground中调用publishProgress,则:onPreExecute->doInBackground->onProgressUpdate->onPostExecute

AsyncTask还提供了onCancelled方法,该方法也是在主线程执行,若调用了onCancelled,则onPostExecute方法不会执行

使用注意事项:

  1. AsyncTask必须在主线程使用 ,execute方法必须在主线程调用,AsyncTask对象必须在主线程声明
  2. 不要在程序中直接调用onPreExecute、doInBackground、onProgressUpdate、onPostExecute四个方法
  3. 一个AsyncTask对象只能执行一次,即execute只能调用一次
  4. AsyncTask在3.0之前是并行任务,之后是串行任务,不过仍然可以调用executeOnExecutor方法来并行执行任务,该方法在3.0之后新加的方法

ThreadPoolExecutor

ThreadPoolExecutor一共有四个构造方法

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue workQueue)
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue workQueue,
                              ThreadFactory threadFactory)
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue workQueue,
                              RejectedExecutionHandler handler)
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

我们常用的一般为:

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue 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。

你可能感兴趣的:(Android中的线程)