Skip to content

底层原语 (Intrinsics)

源:Kotlin 协程内联原语参考

kotlin.coroutines.intrinsics 包包含了一些看似“黑魔法”的函数。它们允许你绕过标准的协程拦截机制,直接操作 Continuation。

核心原语:suspendCoroutineUninterceptedOrReturn

名字超级长,功能超级底层。所有的挂起函数(包括 delay, withContext)最终都能追溯到这个函数。

kotlin
suspend fun <T> justSuspend(block: (Continuation<T>) -> Any?): T = 
    suspendCoroutineUninterceptedOrReturn { cont ->
        block(cont)
    }

它提供了一个极度优化的路径:

  1. 不拦截cont 是裸的,没有经过 ContinuationInterceptor 包装。
  2. 可同步返回:如果你的逻辑不需要挂起,直接返回结果对象即可。
  3. 可挂起:如果有挂起,返回 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。