进阶之路-Java与Android中多线程的实现
Java中的多线程实现
在Java中实现多线程的方法有:
- 创建Thread
- 实现Runable
- 实现Callable
- 线程池ExecutorService
具体可看:Java多线程基础知识
Android中的多线程实现
在Android中,实现多线程处理任务,有更丰富的实现:
- 实现HandlerThread
- 实现AsyncTask
- 实现IntentService
- 创建线程池ExecutorService
HandlerThread
HandlerThread的本质
本质上HandlerThread是通过继承Thread类和封装Handler来实现线程之间的通信。内部原理依旧是Thread类+Hnadler类机制。
- 通过继承Thread类,快速地创建1个带有Looper对象的新工作线程,并且拥有自己的MessageQueue
- 通过封装Handler类,快速创建Handler & 与其他线程进行通信
- 因此HandlerThread本身就是一个线程
- 不同于直接通过Thread类创建的线程,HandlerThread它是一个带有Looper,并且通过Looper会创建MessageQueue的线程。
- Handler中必须要由Looper,而在UI主线程中默认为我们创建了Looper,如果通过Thread创建的线程是没有Looper。在创建Handler的过程中可以指定任意线程的Looper对象。
- 这样的设计使得HandlerThread其实和UI主线程类似,可以通过HandlerThread来分担UI线程的工作量,降低主线程的压力。
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中的线程池