协程简介
协程是轻量级的线程,它们在某些coroutiue上下文中与launch构建器一起启动。GlobalScope的生命周期与整个应用程序的生命周期一致。
阻塞与非阻塞
先说结论:
- launch不会阻塞线程
- async可以阻塞协程也可以不阻塞协程(无法直接运行在线程里,只能运行在协程里)
- runBlocking会阻塞线程
- suspend会阻塞协程(只能运行在协程里,无法运行在线程里)
- withContext会阻塞协程(只能运行在协程里,无法运行在线程里)
launch不会阻塞所在线程
- 代码
fun main() = runBlocking {
log("准备启动协程")// ::A
GlobalScope.launch {
log("运行协程")// ::B
delay(1)
}
log("代码运行到协程体之外")// ::C
delay(2)
}
- 日志输出
日志: 准备启动协程
日志: 代码运行到协程体之外
日志: 运行协程
- 结论
本例代码中C处的日志比B处先执行,所以证明lunch不会阻塞
async可阻塞也可以不阻塞
不使用await
- 代码
fun main() = runBlocking {
log("A--进入async方法体内")//A
val async = GlobalScope.async {
log("B--开始执行async方法体")//B
delay(1)
log("C--async方法体执行完成")//C
}
log("D-- async方法体外执行")//D
delay(2)
}
- 日志
日志: A--进入async方法体内
日志: D-- async方法体外执行
日志: B--开始执行async方法体
日志: C--async方法体执行完成<