底层原语 (Intrinsics)
kotlin.coroutines.intrinsics 包包含了一些看似“黑魔法”的函数。它们允许你绕过标准的协程拦截机制,直接操作 Continuation。
核心原语:suspendCoroutineUninterceptedOrReturn
名字超级长,功能超级底层。所有的挂起函数(包括 delay, withContext)最终都能追溯到这个函数。
kotlin
suspend fun <T> justSuspend(block: (Continuation<T>) -> Any?): T =
suspendCoroutineUninterceptedOrReturn { cont ->
block(cont)
}它提供了一个极度优化的路径:
- 不拦截:
cont是裸的,没有经过ContinuationInterceptor包装。 - 可同步返回:如果你的逻辑不需要挂起,直接返回结果对象即可。
- 可挂起:如果有挂起,返回
COROUTINE_SUSPENDED。
手动拦截 (intercepted)
如果你拿到了一个裸的 Continuation,但希望它的恢复操作经过调度器(例如切回主线程),你需要手动拦截它。
kotlin
// 1. 获取裸续体
val rawCont = ...
// 2. 包装成带调度的续体
val intercepted = rawCont.intercepted()
// 3. 恢复
intercepted.resume(Unit)手动创建与启动
你可以像操作普通对象一样创建一个协程,而不立即启动它。
kotlin
val workflow = suspend {
println("Step 1")
yield()
println("Step 2")
}
// 创建状态机实例,但不运行
val cont = workflow.createCoroutine(Continuation(EmptyCoroutineContext) {
println("Done")
})
// 手动启动
cont.resume(Unit)风险警示
仅限库作者使用
直接操作 Intrinsics 意味着你放弃了协程框架提供的所有安全网(如异常传播、Job 取消检查、Dispatcher 调度)。
- 如果你忘了检查
isActive,协程可能永远无法被取消。 - 如果你搞错了
resume次数,程序会 Crash。