Kotlin 为什么协同路由第一次在调用线程上运行,但在第一个挂起点之后,它在“;调度员。无限制的”;?

Kotlin 为什么协同路由第一次在调用线程上运行,但在第一个挂起点之后,它在“;调度员。无限制的”;?,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,下面是代码打印 import kotlinx.coroutines.* fun main() = runBlocking<Unit> { launch(Dispatchers.Unconfined) { // not confined -- will work with main thread println("thread ${Thread.currentThread().name}")

下面是代码打印

import kotlinx.coroutines.*

    fun main() = runBlocking<Unit> {
        launch(Dispatchers.Unconfined) {
            // not confined -- will work with main thread
            println("thread ${Thread.currentThread().name}")
            delay(500)
            println("thread ${Thread.currentThread().name}")
        }
    }
阅读的描述,它准确地解释了这种行为:

不局限于任何特定线程的协同路由调度程序。它在当前调用帧中立即执行协程的初始延续,并允许协程在相应挂起函数使用的任何线程中恢复,而不强制执行任何特定的线程策略注意:请务必小心使用,不要用于一般代码


Unconfined
调度程序没有与之关联的线程。几乎在所有情况下,协程都会在用户调用
continuation.resume()
的线程上恢复

在您显示的特定情况下,您调用标准函数
delay
,因此Kotlin必须在内部处理其暂停和恢复。为了实现这一点,它维护一个计划线程池,并向其提交恢复任务,该线程池按照您指定的延迟进行计划


Unconfined
dispatcher仅在特殊情况下有用,在这种情况下,您可以编写自己的基础结构,并希望控制恢复协同路由的线程。基本上,它会使整个调度机制短路

 thread main
 thread kotlinx.coroutines.DefaultExecutor