Android 协程、线程和进程对比分析

 更新时间:2026年02月02日 09:27:29   作者:倾云鹤  
文章主要介绍了Android开发中进程、线程和协程的基本概念及其在Android系统中的表现形式,强调了它们在多任务操作系统中的作用和特点,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

在 Android 开发中,理解进程和线程的概念非常重要。进程和线程不仅是操作系统的基本概念,其在 Android 系统中的表现形式与四大组件也有密切关联。本文将通过梳理进程和线程的基本概念及其在 Android 中的特点,为开发者提供清晰的理解。

进程和线程的基本概念

1. 进程

  • 定义:
  • 进程是资源分配的基本单位,每个进程都拥有独立的地址空间、内存和资源。在多任务操作系统中,进程是实现程序并发运行的核心机制。
  • 特点:
    • 独立性:进程之间互不干扰,每个进程都有自己的地址空间。
    • 高资源开销:进程切换需要保存和恢复上下文(如地址空间、寄存器状态等)。
    • 安全性高:进程间的资源隔离较为彻底。

2. 线程

  • 定义:
  • 线程是 CPU 调度的基本单位,运行在进程中的一个执行单元。线程共享同一进程的资源(如内存、文件句柄),可以通过多线程实现并发操作。
  • 特点:
    • 轻量级:线程比进程更高效,占用资源少。
    • 共享性:同一进程内的线程共享内存地址空间。
    • 依赖性:一个线程崩溃可能会影响整个进程。
特性进程线程协程
本质资源分配的基本单位,应用沙盒的基础操作系统调度的基本单位用户态的轻量级任务
隔离性,独立内存空间,崩溃互不影响,共享进程内存,一个线程崩溃可能导致整个进程崩溃,运行在线程之上,共享线程上下文
资源开销高(独立内存空间,创建/切换成本大)中等(拥有独立栈,共享堆)极低(用户态调度,可轻松创建数万个)
通信方式IPC(如 Binder、AIDL),复杂昂贵共享内存(需同步机制)或 Handler/Looper挂起函数ChannelFlow,类似顺序函数调用
阻塞性阻塞自身进程阻塞底层线程(主线程阻塞导致ANR)非阻塞挂起,释放底层线程做其他工作

协程的优缺点

协程是 Google 推荐的 Android 异步编程解决方案,它的核心优势在于用看似同步的方式写异步代码,极大简化了逻辑。

核心优势

  • 大幅简化异步代码:通过挂起机制,彻底告别“回调地狱”,使异步代码的逻辑清晰得像同步代码一样。
  • 极低的性能开销:作为用户态管理的任务,协程的创建和切换开销远小于线程,允许你大规模创建而无需担心资源耗尽。
  • 强大的结构化并发:通过 CoroutineScope(如 viewModelScope)管理生命周期,当作用域被取消时,其内部所有协程都会被自动取消,有效防止内存泄漏。
  • 灵活的线程调度:可以轻松使用 withContext(Dispatchers.IO)Dispatchers.Default等在不同线程间流转,并在结束时自动切回原线程。

需要注意的局限性

  • 不直接提升CPU密集型任务性能:协程的本质是协作式任务管理,对于纯计算任务,如果不切换到合适的调度器(如Dispatchers.Default),尤其是在主线程上执行,同样会阻塞UI导致ANR。
  • 单线程特性限制:一个线程内的多个协程仍是顺序执行,无法直接利用多核优势实现真正并行。需通过“多线程+协程”模式(即启动多个运行在不同线程上的协程)来发挥多核性能。
  • 错误处理需谨慎:协程内部的未捕获异常会向上传播,可能导致父协程取消。必须使用 try-catch或 CoroutineExceptionHandler妥善处理。
  • 警惕底层阻塞操作:若协程中调用了底层系统阻塞操作,可能导致整个线程被阻塞,影响该线程上运行的其他协程。

如何选择

  • 需要执行网络请求、数据库操作、文件读写等任务 → 首选协程
  • 需要响应 UI 事件或执行与生命周期相关的任务 → 首选协程,并配合 lifecycleScope或 viewModelScope
  • 需要与严格要求特定线程的底层原生库交互 → 可以考虑使用线程来满足其严格的线程模型要求。
  • 需要实现组件或应用的强隔离,或突破单进程内存限制 → 慎重考虑使用多进程,但务必明确其复杂的通信开销。

使用示例

// 等待型调度器
private var sendCoroutineScope: CoroutineScope? = CoroutineScope(Dispatchers.IO)
sendCoroutineScope?.launch {
	// 网络请求、数据库操作、文件读写等任务
}
// 计算型调度器
private var calculateCoroutineScope: CoroutineScope? = CoroutineScope(Dispatchers.Default)
calculateCoroutineScope?.launch {
	// 网络请求、数据库操作、文件读写等任务
}
// 绑定对象为LifecycleOwner(如 Activity, Fragment),绑定的 Activity或 Fragment被销毁(onDestroy())时将取消该协程
lifecycleScope.launch {
	// UI层操作:界面更新、动画、与UI生命周期紧密相关的任务
}
// 绑定对象为ViewModel,ViewModel的 onCleared()方法被调用时将取消该协程
viewModelScope.launch {
	// 数据层操作:网络请求、数据库读写、耗时计算
}

到此这篇关于Android 协程、线程和进程对比的文章就介绍到这了,更多相关android 协程、线程和进程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • android studio3.0.1无法启动Gradle守护进程的解决方法

    android studio3.0.1无法启动Gradle守护进程的解决方法

    这篇文章主要为大家详细介绍了android studio3.0.1无法启动Gradle守护进程的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android编程实现Dialog窗体监听的方法

    Android编程实现Dialog窗体监听的方法

    这篇文章主要介绍了Android编程实现Dialog窗体监听的方法,结合实例形式分析了Android针对Dialog对话框窗体事件监听与响应相关操作技巧,需要的朋友可以参考下
    2017-03-03
  • Retrofit源码之请求对象的转换笔记

    Retrofit源码之请求对象的转换笔记

    这篇文章主要介绍了Retrofit源码之请求对象的转换笔记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Android开发实现浏览器全屏显示功能

    Android开发实现浏览器全屏显示功能

    这篇文章主要介绍了Android开发实现浏览器全屏显示功能,涉及Android布局修改及相关属性动态设置操作技巧,需要的朋友可以参考下
    2017-09-09
  • Android自定义View实现角度选择器

    Android自定义View实现角度选择器

    前几天在Google Photos查看照片,用了一下它的图片剪裁功能,于是我马上就被其界面和操作吸引。后来想模仿做一个和Google Photos裁图页面几乎一模一样的角度选择器,本文比较基础,在阅读本文前只需要掌握最基础的自定义View知识和Android事件知识。下面来一起学习下吧。
    2016-11-11
  • Android基于opencv实现多通道分离与合并

    Android基于opencv实现多通道分离与合并

    针对图像多通道的分离与混合,OpenCV 4中提供了split()函数和merge()函数用于解决这些需求。本文讲解一下Android如何调用这些函数实现多通道分离与合并
    2021-06-06
  • Flutter学习教程之Route跳转以及数据传递

    Flutter学习教程之Route跳转以及数据传递

    这篇文章主要给大家介绍了关于Flutter学习教程之Route跳转以及数据传递的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Flutter具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Android自定义控制条效果

    Android自定义控制条效果

    这篇文章主要为大家详细介绍了Android自定义控制条效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Android仿音乐播放器功能

    Android仿音乐播放器功能

    这篇文章主要为大家详细介绍了Android仿音乐播放器功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Android仿微信图片点击浏览的效果

    Android仿微信图片点击浏览的效果

    这篇文章主要为大家详细介绍了Android仿微信图片点击浏览的效果,Android 2D平滑放大显示ImageView,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09

最新评论