在 Android 开发中,子线程(Worker Thread)是实现多任务并发、避免主线程阻塞的核心机制。本文将从主线程与子线程的区别、子线程的实现方式、线程间通信及现代并发方案等角度进行专业解析。

主线程(UI 线程)负责 UI 渲染和事件响应,所有耗时操作必须在子线程执行,否则会触发ANR(Application Not Responding)。二者的核心差异如下表:
| 维度 | 主线程 | 子线程 |
|---|---|---|
| 职责 | UI 更新 | 耗时操作 |
| 阻塞风险 | 不允许耗时操作 | 可执行 I/O、网络请求等 |
| 系统限制 | ANR 超时时间:5s | 无强制限制 |
| UI 操作权限 | 可直接修改 UI | 需通过 Handler 或 runOnUiThread |
Android 线程管理基于 Looper/Handler/MessageQueue 三要素:
| 组件 | 作用 | 关联说明 |
|---|---|---|
| Looper | 消息循环驱动 | 主线程默认开启,子线程需手动调用 Looper.prepare() |
| MessageQueue | 消息存储队列 | 每个 Looper 对应一个消息队列 |
| Handler | 消息处理器 | 发送和处理 Message/Runnable 对象 |
| 方法 | 原理 | 生命周期管理 | 适用场景 |
|---|---|---|---|
| Thread | Java 原生 API | 手动控制 | 简单异步任务 |
| AsyncTask | 封装 Handler+线程池 | 与 Activity 关联(易泄漏) | Android 3.0前短期任务 |
| HandlerThread | 自带 Looper 的线程 | 需显式调用 quit() | 需持续处理消息的任务 |
| ExecutorService | 线程池管理 | 统一维护线程资源 | 高并发 I/O 密集型任务 |
| Kotlin 协程 | 轻量级线程调度 | 结构化并发自动取消 | 现代异步编程首选 |
1. 线程安全:多线程共享数据时需同步(synchronized/ReentrantLock)
2. 内存泄漏:Handler/AsyncTask 持有 Activity 引用需弱引用
3. ANR 规避:所有文件读写、数据库查询、网络请求强制在子线程执行
4. 资源释放:使用完的线程池需调用 shutdown()
随着 Kotlin 的普及,协程(Coroutine)成为替代子线程的主流方案,其优势包括:
- 轻量级:单线程可启动数万个协程(传统线程约1MB/个)
- 简化回调嵌套:用同步代码风格实现异步操作
- 结构化取消:通过 CoroutineScope 自动管理生命周期
Android 官方还推荐以下工具:
- WorkManager:后台任务调度(兼容设备休眠)
- LiveData:主线程观測子线程数据变化
- Flow:协程环境下的响应式流处理
合理使用子线程是 Android 高性能应用的基础。开发者需根据场景选择 Thread、线程池或协程等方案,同时遵守线程安全和生命周期管理原则。在 Jetpack 组件和 Kotlin 协程的加持下,现代 Android 开发已大幅降低多线程编程复杂度。