我在try 理解协程是如何工作的.我有这样一段简单的代码,它挂起协程并在不同的线程中恢复它.

fun main(){
    fun pt(msg : String){
        println("${Thread.currentThread().name}: ${msg}")
    }
    suspend fun a(){
        pt("A")
        suspendCoroutine { cont ->
            thread (name = "new thread") {
                pt("resuming")
                cont.resume(Unit)
            }
        }
        pt("B")
    }
    runBlocking {
        a()
    }
}

由于协程在new thread中恢复,我本以为B的打印也是由这个线程完成的,但似乎并非如此.

main: A
new thread: resuming
main: B

有人能解释一下这是怎么回事吗?启动Continue对象的协程部分并且resume调用将执行传递给它的原始线程是吗?

推荐答案

您不是在新的帖子中继续.您正在使用新线程在协程挂起时执行某些操作(打印"恢复"),并指示协程继续执行.然后,这个线程就结束了.这不是让线程执行协同工作的方式.调度器负责将协程工作块分配给线程.

Kotlin相关问答推荐

用A*搜索算法解决特修斯和米诺陶尔难题

Kotlin Poet 的导入不明确

collectAsState 未从存储库接收更改

Kotlin supervisorScope 即使包裹在 try catch 中也会失败

如何判断给定字符串是否多次包含另一个子字符串?

Kotlin SAM/功能接口抛出 AbstractMethodError

如何在 Hibernate Panache 中进行部分搜索

在 APK META-INF/library_release.kotlin_module 中复制的重复文件

Kotlin:泛型、反射以及类型 T 和 T:Any 之间的区别

Kotlin 静态函数:伴生对象,@JvmStatic @JvmField

Android Studio 4.0.0 Java 8 库在 D8 和 R8 构建错误中脱糖

Kotlin get字段注释始终为空

在调用Kotlin数据类中的超类构造函数之前访问函数

RecyclerView SnapHelper无法显示第一个/最后一个元素

Kotlin通过映射委托属性,如果映射中不存在,则抛出NoTouchElementException

添加抽象的私有getter和公共setter的正确方法是什么?

在 sharedPref.getString 中有一个默认值有什么意义?

WebFlux 功能:如何检测空 Flux 并返回 404?

Recyclerview: listen to padding click events

var str:String是可变的还是不可变的?