在 Android 中有主线程和子线程,主线程只有一个,子线程可以有多个,当有多个子线程时就是多线程了。多线程属于异步处理任务技术,该技术主要是为了提高应用效率问题。
线程?
线程是程序执行的最小单元。
多线程?
多线程就是多个线程一起执行。
例如:我们使用微信聊天的同时还能继续播放着公众号文章中的音频。
多进程?
进程是程序的基本执行实体。我们手机上的每个 App 都是一个进程。
在 Android 上是如何开启线程的呢?我了解的有下面两种方式
方式1:继承 Tread
类
方式2:实现 Runable
接口
推荐使用 方式2 来实现,继承在面向对象中是用来拓展新功能,显然这里不是拓展新功能。
伪代码如下:
public class MyRunnable implements Runnable{
@Override
public void run(){
// 实现具体逻辑
}
}
// 使用
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
Android 中的处理异步处理任务的方式还有以下几种:
-
Handler
主要用来发送消息和接收消息,发送消息通过post
方法实现,接收消息是通过dispatchMessage
方法实现。
它的底层实现需要 MessageQueue 和 Looper
的支持。主要流程是 Looper
通过无限循环去查找 MessageQueue
中是否有消息,有的话就处理消息,没有则一直待着。
线程是由生命周期的,当线程执行完成后,线程生命周期便该终止了,线程退出。而对于主线程,我们是绝不希望会被运行一段时间,自己就退出,那么如何保证能一直存活呢?简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会被退出
-
HandlerThread
它继承了Thread
,内部集成了Looper 和 MessageQueue
的线程,是一种具有消息循环的线程,在它的内部可以使用Handler
; -
ntentService
它是一个服务,系统对其进行封装,使其可以更方便的执行后台任务IntentService
内部使用了HandlerThread
来执行任务,当任务执行完成之后IntentService
会自动退出。
从任务执行的角度来看, IntentService
更像是一种后台线程,但是 IntentService
又是一种服务,它不容易被系统杀死,所以可以保证任务能够一直执行。而如果只是后台进程,那么这个进程的优先级就会非常低,很容易被后台杀死。
-
Executors
可以用于方便的创建线程池,Executors为Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类
提供了一些工具方法。
在操作系统中,线程是操作系统调度的最小的单元,同时线程又是一种受限制的系统资源,即线程是不可能无限制的产生,并且线程的创建和销毁都会有相应的开销,所以在 Android
中为了避免线程的无限创建,因此有了线程池的概念,主要是通过 Executor
来派生特定类型的线程池,不同种类的线程池又具有各自的特性。
-
AsyncTask
是在Executor
的基础上进行封装,它实现耗时任务移动到工作线程中执行,并提供方便的接口实现工作线程和主线程的通信。其底层用到了线程池,而IntentService 和 HandlerThread
底层则直接调用了线程。AsyncTask
封装了线程池和Handler
,其主要是为了开发者在子线程中更新UI
;
Android AysncTask 从源码角度简单理解它的使用限制原因
Android IntentService 从源码角度分析和简单使用
Android 中的线程池简单理解
参考
《Android 开发艺术探索》
《Android 高级进阶》
网友评论