文章目录
- 一、协程是什么
- 1.简介
- 2.协程好在哪
- 3.协程具体怎么用
- a.添加依赖
- b.开始使用
- c.suspend
- 4.小结
- 二、挂起是什么
- 1.「挂起」的本质
- 线程:
- 协程:
- 2.怎么就「挂起」了?
- 3.suspend 的意义?
- 4.怎么自定义 suspend 函数?
- a.什么时候需要自定义 suspend 函数
- a.具体该怎么写
- 5.小结
- 1.「挂起」的本质
- 三、挂起的非阻塞式是怎么回事
- 1.什么是「非阻塞式挂起」
- 2.为什么要讲非阻塞式挂起
- 3.协程与线程
- 4.小结
- 四、总结
一、协程是什么
1.简介
协程并不是 Kotlin 提出来的新概念,其他的一些编程语言,例如:Go、Python 等都可以在语言层面上实现协程,甚至是 Java,也可以通过使用扩展库来间接地支持协程。
「协程 Coroutines」源自 Simula 和 Modula-2 语言,这个术语早在 1958 年就被 Melvin Edward Conway 发明并用于构建汇编程序,说明协程是一种编程思想
,并不局限于特定的语言。
当我们在了解协程
的时候,不可避免的会跟线程
、进程
做比较做分析,下面来贴个图便于理解
从 Android 开发者
的角度去理解它们的关系:
- 我们所有的代码都是跑在线程中的,而线程是跑在进程中的。
- 协程没有直接和操作系统关联,但它不是空中楼阁,它也是跑在线程中的,可以是单线程,也可以是多线程。
- 单线程中的协程总的执行时间并不会比不用协程少。
- Android 系统上,如果在主线程进行网络请求,会抛出
NetworkOnMainThreadException
,对于在主线程上的协程也不例外,这种场景使用协程还是要切线程的。
协程设计的初衷是为了解决并发问题,让 「协作式多任务」 实现起来更加方便。
协程就是 Kotlin 提供的一套线程封装的 API,但并不是说协程就是为线程而生的。
不过,我们学习 Kotlin 中的协程,一开始确实可以从线程控制的角度来切入。因为在 Kotlin 中,协程的一个典型的使用场景就是线程控制。就像 Java 中的Executor
和 Android 中的AsyncTask
,Kotlin 中的协程也有对 Thread API 的封装,让我们可以在写代码时,不用关注多线程就能够很方便地写出并发操作。
下面的例子是使用协程进行网络请求获取用户信息并显示到 UI 控件上:
代码语言:javascript复制launch({
val user = api.getUser() //