gpt4 book ai didi

asynchronous - 如何理解 Kotlin 协程?

转载 作者:行者123 更新时间:2023-12-02 11:51:53 27 4
gpt4 key购买 nike

我已经尝试阅读有关 Kotlin 协程的各种教程和页面,尽管它对我来说有点道理,但我仍然觉得它没有被点击,我还没有准备好开始使用协程编写异步非阻塞代码。我认为我缺少的是一个图表或图片,说明一段协程代码执行时究竟发生了什么以及以什么顺序执行。该代码如何在线程级别运行?

    launch {
delay(1000)
println("World (${currentThread().name})")
}
println("Hello (${currentThread().name})")
sleep(1500)

我的理解是这样的。我很高兴得到纠正或给出不同的例子来加深我的理解。

Line0:代码从主线程开始

Line1:在新线程上启动一个新的协程(我想来自 forkjoin 池)

Line2:挂起函数,因此协程挂起并将线程返回到线程池(因此是非阻塞的)

Line5:在主线程上打印

Line6:阻塞主线程1.5s

Line3:协程恢复执行(不确定这里的哪个线程 - 与挂起之前的线程相同还是可以是不同的线程?)。协程在该线程上打印并完成,因此再次将线程返回到池中。

我的另一个问题是,如果我将整个代码包装在 runBlocking { ... } 周围,低级执行将如何变化?

最佳答案

您的代码实际上并没有做任何可以揭示协程特殊性质的事情。它使两个线程同时做他们的事情,就像他们在普通的 Java 中做的一样。

只有在您已经在同一个线程(例如,主线程)上启动协程时,它才会变得有趣。这是您通过 runBlocking 实现的目标之一堵塞:

runBlocking {
launch {
delay(1000)
println("Hello from the launched coroutine. My thread is "
+ Thread.currentThread().name)
}
println("Hello from the top-level coroutine. My thread is "
+ Thread.currentThread().name)
}

这将打印
Hello from the top-level coroutine. My thread is main
Hello from the launched coroutine. My thread is main
runBlocking在调用线程上运行一个事件循环,并将对它的引用传播到您在其中启动的所有协程。例如, delay(1000)将向此事件循环发布一个事件,并指定一秒的延迟,然后它将暂停协程。这将允许主线程运行 launch 下面的其余代码。 .当时间过去时,事件循环将运行事件处理程序,这将反过来恢复协程。

一个更有教育意义的例子是启动一个没有任何 Dispatcher 的协程。 .这消除了协程看起来像线程的错觉,并揭示了它们真正的魔力:通过调用 continuation.resume()你让当前线程直接跳到挂起的协程代码块的中间,所有这一切都使用普通的 Java 方法调用。建议学习 this answer对此进行了详细说明。如果您有兴趣更深入地解释普通 Java 方法如何实现这一技巧,我建议您观看 Roman Elizarov explaining this在YouTube上。

关于asynchronous - 如何理解 Kotlin 协程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57243903/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com