1、协程是什么
轻量级的线程管理框架
2、协程的特性
- 挂起与恢复**
suspend
**:可在耗时操作时挂起,释放线程资源,完成后自动恢复; - 非阻塞式并发:通过协作式调度实现任务的切换;
- 结构化并发:通过作用域自动管理协程生命周期;
其中suspend的实操和原理有单独文章:https://blog.csdn.net/qq_39731011/article/details/123507414
3、协程的使用
1.协程的创建:
launch//协程启动
async//协程启动 - 可能有结果返回
Kotlin
CoroutineScope(Dispatchers.Default).launch {
//执行内容
}
CoroutineScope(Dispatchers.Default).async {
//执行可能返回结果的内容
}.await()
//await(): 拿到具体返回结果
2.让协程运行在指定线程:
注意线程创建时传入的参数:Dispatchers(协程调度器)
Dispatchers.Main
这表示协程运行在主线程
这表示协程运行在子线程
Dispatchers.Default
这表示协程运行在基于ForkJoinPool
的特殊线程池
它采用了工作窃取算法。可以高效处理大量的小任务
关于工作窃取算法,我这边写了单独的文章https://zhaoxinghai.blog.csdn.net/article/details/152085302
3.协程的关闭:
使用协程创建返回的Job对象,并调用其cancel方法
Kotlin
val job: Job = GlobalScope.launch {
//执行任务
}
job.cancel()//协程关闭/取消
3、协程的生命周期:
正常执行:
创建 -> 执行中 ->完成 ->关闭(进入清理状态)
如果使用了挂起函数suspend:
创建 -> 执行中 ->释放线程等待恢复 ->执行中 ->完成 ->关闭
4、协程的原理:
当遇到一个挂起函数时,就会将协程的代码置换为一个状态机。
假设你的协程代码是这样: 最终的打印顺序为注释中的"1""2""3""4"
Kotlin
launch {
println("准备执行挂起函数") //1
doSomething()
println("他挂起了,所以先执行了我") //3
}
suspend fun xxx() {
println("进入挂起函数了") //2
delay(1000) //假定执行了耗时操作
println("挂起函数执行完毕了") //4
}
置换为状态机后的简化代码如下:
Kotlin
// 当前状态
var state = 0
// 核心方法
override fun resumeWith(result: Result<Unit>) {
when (state) {
0 -> {
xxx(1000, this)//xxx指代挂起函数修饰的方法
state = 1
// 代挂起函完成,会再次调用resumeWith方法
resumeWith()
}
1 -> {
//这时候状态机的状态已经回复,会继续执行挂起函数之后的正常任务内容
}
}
}
5、协程的扩展应用:
Android Flow的基本使用和常用操作符http://zhaoxinghai.blog.csdn.net/article/details/152259008
文章到这里就结束了
如果您感觉文章有用的话,麻烦点个赞吧!
如果您发现文章有任何错误或建议,请评论区留言或者私信!
深海谢过各位的支持,一起加油!
