(十五)Android的线程和线程池

来源:互联网 发布:windows aero桌面性能 编辑:程序博客网 时间:2024/06/05 08:49
进程:可并发执行且具有独立功能的程序,是操作系统进行资源分配的基本单位。
线程:处理器调度和运行的基本单位。
Android中的线程分为主线程和子线程,主线程的作用是运行四大组件以及处理他们和用户的交互,而子线程的作用则是执行耗时任务,如网络请求、I/O操作等。从Android3.0后,,系统要求网络访问要在子线程中进行,以防出现ANR现象。
 
Android中的线程形态之AsyncTask
       AsyncTask是一种轻量级的任务类,他可以在线程池中执行任务,然后把执行的结果返给主线程。AsyncTask封装了Thread和Handler,通过它可以方便的执行后台任务和在主线程中访问UI,但他并不适合进行特别耗时的操作。


AsyncTask的工作原理
     具体过程为以下几步:
  1. execute中:返回executeOnExecutor方法 
  2. executeOnExecutor中:onPreExecute方法最先执行,然后线程池执行。具体方法是SerialExecutor的execute方法执行(参数为mFuture)。
          此处前提为涉及到AsuncTask的构造器方法,在构造器中,参数params封装到WorkerRunnable的mWorker对象中,mWorker又封装到FutureTask的mFuture对象中。
     3. SerialExecutor的execute方法: 创建消息队列,先调用mTask.offer方法,内部逻辑为offerLast,addLast,将mFuture加入到队列;再调用scheduleNext方法来执行下一个AsyncTask任务。
     4. ScheduleNext方法 :  发送handler消息。
  1. Handler是一个静态对象,收到消息后会调用AsyncTask的finish方法。
  2. finish方法:逻辑为, 若 AsyncTask 被取消执行,就调用 onCancelled ,否则调用onPostExecute方法。

AsyncTask在Android3.0以上版本是串行执行的,在之下版本是并行执行,若想Android3.0以上版本并行执行,可以调用executeOnExecutor方法,此方法是Android3.0后出现的。


第二步过程源码:


AsyncTask的构造器方法:


SercialExecutor的execute方法:


构造器中调用的postResult方法:



handler的实现类:


Android中的线程线程形态之HandlerThread
HandlerThread继承自Thread,是一种可以使用handler的thread,因其run方法是一个无限循环,当不需要使用HandlerThread时,可以通过调用它的quit或者quitSafely方法退出,他的run方法如下:


Android中的线程线程形态之IntentService
     IntentService是一种特殊的Service,它继承了Service并且是一个抽象类。因此必须创建它的子类并重写onHandlerIntent方法才能使用IntentService。可用于执行后台耗时的任务,当任务停止后他会自动停止。由于IntentService是服务的原因,导致他的优先级比单纯线程高,可执行优先级高的后台任务。他在实现上封装了HandlerThread和Thread。

每次启动IntentService,他的onStartCommand方法会被调用一次,在onStartCommand方法中会调用onStart方法,


ServiceHandler类的实现:


Android中的线程池
线程池的好处:
1.重用线程,避免线程的创建和销毁带来的开销。
2.能有效控制线程最大并发数,避免大量线程之间抢占系统资源而导致阻塞现象。
3.能对线程进行简单管理,并提供定时执行和指定间隔循环执行。

Android中的线程池都是直接或间接通过配置ThreadPoolExecutor来实现的,
ThreadPoolExecutor方法具体参数如下:


在AsyncTask中对线程池的配置:


线程池的分类:
在Executors类中,
FixedThreadPool:线程数量固定的线程池,当线程处于空闲状态时,不会被回收,除非线程池关闭。它只拥有核心线程且不会被回收无超时机制,so能更快响应外界请求。通过newFixedThreadPool创建。

CachedThreadPool:通过newCachedThreadPool创建。它是一种数量不定的线程池,只有非核心线程,并且最大线程数为Integer.MAX_VALUE.他的空闲线程都有超时机制,可以理解为他的任务队列是一个空集合,无法存储元素。任务来了会立即执行。适合执行大量的耗时较少的操作。


ScheduledThreadPool:此线程池的核心线程数固定,非核心线程数无限制。用于执行定时任务和具有固定周期的重复任务。

SingleThreadPool:只有一个核心线程,确保所有任务都在一个线程中按顺序执行,意义在于统一所有的外界任务到一个线程,以便在这些任务间不需处理同步问题。









简洁版源码:

构造方法:



InternalHandler源码:



AsyncTask的excute方法的源码: