Kotlin协程到底是怎么切换线程的?你是否知晓?,2024年Android开发学习路线

本文深入探讨了Kotlin协程的线程切换机制,从创建协程体、创建拦截器到执行过程。通过分析`startCoroutineCancellable`方法,揭示了如何利用`ContinuationInterceptor`进行线程调度。文章还提到了调度器如`HandlerDispatcher`在主线程切换中的作用,并讨论了`delay`函数的实现。最后,文章给出了Android开发者在面试前应复习的学习资源。
摘要由CSDN通过智能技术生成

接着调用CoroutineStartstart来启动协程,默认情况下调用的是CoroutineStart.Default

经过层层调用,最后到达了:

internal fun <R, T> (suspend ® -> T).startCoroutineCancellable(receiver: R, completion: Continuation) =

runSafely(completion) {

// 外面再包一层 Coroutine

createCoroutineUnintercepted(receiver, completion)

// 如果需要,做拦截处理

.intercepted()

// 调用 resumeWith 方法

.resumeCancellableWith(Result.success(Unit))

}

这里就是协程启动的核心代码,虽然比较短,却包括3个步骤:

1.创建协程体Continuation

2.创建拦截 Continuation,即DispatchedContinuation

3.执行DispatchedContinuation.resumeWith方法

2.3 创建协程体Continuation

调用createCoroutineUnintercepted,会把我们的协程体即suspend block转换成Continuation,它是SuspendLambda,继承自ContinuationImpl

createCoroutineUnintercepted方法在源码中找不到具体实现,不过如果你把协程体代码反编译后就可以看到真正的实现

详情可见:字节码反编译

2.4 创建DispatchedContinuation

public actual fun Continuation.intercepted(): Continuation =

(this as? ContinuationImpl)?.intercepted() ?: this

//ContinuationImpl

public fun intercepted(): Continuation<Any?> =

intercepted

?: (context[ContinuationInterceptor]?.interceptContinuation(this) ?: this)

.also { intercepted = it }

//CoroutineDispatcher

public final override fun interceptContinuation(continuation: Continuation): Continuation =

DispatchedContinuation(this, continuation)

从上可以提炼出以下信息

1.interepted是个扩展方法,最后会调用到ContinuationImpl.intercepted方法

2.在intercepted会利用CoroutineContext,获取当前的拦截器

3.因为当前的拦截器是CoroutineDispatcher,因此最终会返回一个DispatchedContinuation,我们其实也是利用它实现线程切换的

4.我们将协程体的Continuation传入DispatchedContinuation,这里其实用到了装饰器模式,实现功能的增强

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值