协程或函数可以被暂停吗?
根据 Kotlin 官方文档:
基本上,协程是可以在不阻塞线程的情况下暂停的计算。
我听人们经常说 "suspend 函数"。但我认为被暂停的是协程,因为它在等待函数执行完毕。在这种情况下,"suspend" 通常意味着 "停止操作",也就是协程处于空闲状态。
我们应该说协程被暂停了吗?
哪个协程会被暂停?
根据 Kotlin 官方文档:
继续类比,await() 可以是一个暂停函数(因此也可从 async {} 块内调用),它会暂停协程直到某个计算完成并返回结果。
async { // Here I call it the outer async coroutine
...
// Here I call computation the inner coroutine
val result = computation.await()
...
}
它说“暂停协程直到某个计算完成”,但协程就像是轻量级的线程。所以如果协程被暂停了,那么计算怎么能完成呢?
我们看到在`computation`上调用了`await`,所以它可能是返回`Deferred`的`async`函数,这意味着它可以启动另一个协程。
fun computation(): Deferred<Boolean> {
return async {
true
}
}
在引用中提到了“暂停协程”。这是指暂停外部的“async”协程,还是暂停内部的“computation”协程呢?
“暂停”是否意味着当外部的“async”协程在等待内部的“computation”协程完成时,它(即外部的“async”协程)会空闲下来(因此被称为暂停),将线程返回给线程池,并且当子“computation”协程完成时,它(即外部的“async”协程)会唤醒,从线程池中获取另一个线程并继续执行?
我提到线程的原因是因为:https://kotlinlang.org/docs/tutorials/coroutines-basic-jvm.html 引用如下: “当协程等待时,线程会返回到线程池中,等待完成后,协程会在线程池中的空闲线程上恢复执行。”