Skip to content

进阶之路-Java与Android中多线程的实现

Java中的多线程实现

在Java中实现多线程的方法有:

  1. 创建Thread
  2. 实现Runable
  3. 实现Callable
  4. 线程池ExecutorService

具体可看:Java多线程基础知识

Android中的多线程实现

在Android中,实现多线程处理任务,有更丰富的实现:

  1. 实现HandlerThread
  2. 实现AsyncTask
  3. 实现IntentService
  4. 创建线程池ExecutorService

HandlerThread

HandlerThread的本质

本质上HandlerThread是通过继承Thread类和封装Handler来实现线程之间的通信。内部原理依旧是Thread类+Hnadler类机制。

  • 通过继承Thread类,快速地创建1个带有Looper对象的新工作线程,并且拥有自己的MessageQueue
  • 通过封装Handler类,快速创建Handler & 与其他线程进行通信
  1. 因此HandlerThread本身就是一个线程
  2. 不同于直接通过Thread类创建的线程,HandlerThread它是一个带有Looper,并且通过Looper会创建MessageQueue的线程。
  3. Handler中必须要由Looper,而在UI主线程中默认为我们创建了Looper,如果通过Thread创建的线程是没有Looper。在创建Handler的过程中可以指定任意线程的Looper对象。
  4. 这样的设计使得HandlerThread其实和UI主线程类似,可以通过HandlerThread来分担UI线程的工作量,降低主线程的压力。

HandlerThread的使用

HandlerThread

AsyncTask

AsyncTask的工作原理

AsyncTask是Android提供的用于实现多线程的类,AsyncTask可以实现多线程协作,异步执行后台任务,并且可以通过主线程更新UI。 AsyncTask的工作原理:创建一个工作线程,在工作线程中执行doInBackground方法处理耗时任务,同时在主线程中调用onProgressUpdate方法更新UI界面。 当doInBackground方法执行完毕,会回调onPostExecute方法,在其中也可以更新UI界面,一般用来处理通知用户任务处理结束的UI显示操作。

AsyncTask的使用

最经典的使用就是下载一个资源,并实时更新下载进度在UI上,下载完毕,弹出用户提示窗口。 需要补充使用用例。

IntentService

IntentService是一种特殊的Service。我们都知道Android的四大组件都是运行在主线程的,但为了处理一些耗时任务,Android官方帮助开发者派生类一些更实用的类,IntentService就是其一。IntentService不同于Service,它可以工作在单独的线程,更适用于处理耗时任务的需求,并且在任务完成后会自动停止。

IntentService的工作原理

IntentService底层原理是利用了HandlerThread,上面学习了HandlerThread的本质就是创建了一个带有Looper的Thread的。Looper掌管着它的MessageQueue(关于MessageQueue和Looper的一一对应关系可以详看ThreadLocal),从MessageQueue中取出一条一条的消息,并通过Handler去调用handleMessage方法。 在IntentService中,handleMessage方法会帮我们去调用onHandleIntent方法,onHandleIntent方法就是我们在使用IntentService时需要实现的方法,耗时任务在该方法中处理。

IntentService的使用

需要补充使用的场景。

ExecutorService

ExecutorService是一个接口。在我们需要多个线程执行耗时任务时,可以使用ExecutorService,它通过维护一个线程池,并控制其中的线程数量,我们只需要把需要处理的任务提交到线程池中,具体调度到哪一个线程由线程池掌控。 关于线程池的知识:Java线程池以及Android中的线程池