Android线程和线程池

2018-10-25  本文已影响0人  左大人

image.png

主线程与子线程

  1. 主线程:主线程主要处理UI交互,需要在任何时候都有较高的响应速度,否则界面会产生卡顿。主线程中不能执行耗时任务,否则会出现ANR。主要作用是运行四大组件,处理它们和用户的交互
  2. 子线程:也叫工作线程,除主线程以外的线程都叫子线程。主要用来处理耗时任务,如网络请求、I/O。

Android中的线程形态

Android中除了传统的Thread之外,还包含了AsyncTask、HandlerThread以及IntentService,这三者底层实现也是Thread,但它们有特殊的形态和各自的优缺点。

  1. AsyncTask
public abstract class AsyncTask<Params, Progress, Result> 
  1. HandlerThread
  1. IntentService

Android中的线程池

  1. 线程池的优点
  1. ThreadPoolExecutor
    ThreadPoolExecutor的继承关系如下:
Executor interface
ExecutorService interface
AbstractExecutorService abstract class
ThreadPoolExecutor class

构造方法如下:

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                            long keepAliveTime,
                            TimeUnit unit,
                            BlockingQueue<Runnable> workQueue,
                            ThreadFactory threadFactory,
                            RejectedExecutionHandler handler) {
      if (corePoolSize < 0 ||
          maximumPoolSize <= 0 ||
          maximumPoolSize < corePoolSize ||
          keepAliveTime < 0)
          throw new IllegalArgumentException();
      if (workQueue == null || threadFactory == null || handler == null)
          throw new NullPointerException();
      this.corePoolSize = corePoolSize;
      this.maximumPoolSize = maximumPoolSize;
      this.workQueue = workQueue;
      this.keepAliveTime = unit.toNanos(keepAliveTime);
      this.threadFactory = threadFactory;
      this.handler = handler;
  }

构造方法中的参数解释:

ThreadPoolExecutor执行逻辑如下:

1. 线程池线程数量未达到核心线程数,直接启动核心线程执行任务
2. 如果达到或超过核心线程数,会插到任务对队列中排队等待执行
3. 任务队列已满,如果线程数量未达到最大线程数,则会启动非核心线程执行任务
4. 如果达到最大线程数,就会拒绝新任务,会调用RejectedExecutionHandler的rejectedExecution来通知调用者
  1. 线程池分类
    主要介绍四种常见的线程池,都直接或间接配置ThreadPoolExecutor实现自己的功能。

总结

本文主要介绍了Android中线程存在形式,还有线程池的分类和使用。希望对大家有帮助。

上一篇 下一篇

猜你喜欢

热点阅读