美文网首页
Android中的线程

Android中的线程

作者: 虎三呀 | 来源:发表于2018-11-30 16:38 被阅读0次

    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),在主线程中执行,当后台任务进度发生变化时调用

    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<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。

    相关文章

      网友评论

          本文标题:Android中的线程

          本文链接:https://www.haomeiwen.com/subject/muhhcqtx.html