过去几天我正在学习协程,您的大多数概念都很清楚,但是我不理解延迟功能的实现。
延迟时间后,延迟功能如何恢复协程?对于一个简单的程序,只有一个主线程,为了在延迟的时间后恢复协程,我认为应该有另一个计时器线程来处理所有延迟的调用并在以后调用它们。是真的吗有人可以解释延迟功能的实现细节吗?
所有挂起的函数以相同的方式工作,在编译时,将其转换为带有回调的状态机。
[当您呼叫delay
时,发生的消息是具有一定延迟的消息张贴在队列上,类似于Handler().postDelayed(delay)
,并且当延迟过去后,它将回调到挂起点并恢复执行。
您可以检查delay
函数的源代码以了解其工作原理:
public suspend fun delay(timeMillis: Long) {
if (timeMillis <= 0) return // don't delay
return suspendCancellableCoroutine sc@ { cont: CancellableContinuation<Unit> ->
cont.context.delay.scheduleResumeAfterDelay(timeMillis, cont)
}
}
因此,如果延迟为正,它将在延迟时间内安排回调。