在之前的文章中,已经讲了如何启动协程、协程的作用域是如何组织和工作的以及各种协程构造器(builder)的特性。
本篇将讲解对协程的各种操作,包括挂起、取消、超时、切换上下文等。
挂起
fun main() {
runBlocking(Dispatchers.Default) {
for (i in 0 .. 10) {
println("aaaaa ${Thread.currentThread().name}")
delay(1000) // 这是一个挂起函数
println("bbbbb ${Thread.currentThread().name}")
}
}
}
delay就是一个挂起函数,挂起的意思是:非阻塞的暂停,与之对应的就是阻塞(的暂停)。比如线程的方法Thread.sleep就是一个阻塞的方法。关于阻塞还是非阻塞,可以简单的理解为: 阻塞就是cpu不执行后面的代码,需要某种通知告诉线程继续执行。 非阻塞就是cpu依然在执行线程的代码,非阻塞的暂停只是通过用户态的程序逻辑让代码块不执行而已。
用图来表示线程阻塞的情况应该是这样:
而在协程中,非阻塞的情况应该是这样: