【问题标题】:How execution of a coroutine resume in main function?如何在主函数中恢复协程的执行?
【发布时间】:2021-11-10 17:48:32
【问题描述】:

如果我们在主函数中使用协程,那么协程的执行如何在延迟后恢复。 就像在这张图片中,协程在 main 函数中,延迟 2 秒后代码恢复。所以我只想知道延迟后执行如何返回代码。我了解状态机以及协程在 android 中的工作原理。我在询问带有主要功能的 kotlin(不在 android 活动中)。

【问题讨论】:

  • 无论平台如何,它们的工作方式都非常相似。上面的代码让你感到困惑的是什么?
  • 在 android 中有 handler 和 looper,所以协程可以恢复任务,但在简单的控制台应用程序中没有 handler 和 looper,所以协程如何在延迟后恢复自己
  • Handler/looper 不是 Android 特有的技术 - 它只是一个线程 + 任务队列。在 Java 中,我们有执行器做类似的事情。 Kotlin 协程也是如此。

标签: multithreading kotlin threadpool main coroutine


【解决方案1】:

如果您知道协程在 Android 中是如何工作的,我不确定是什么让您感到困惑。协程是非阻塞的,所以一旦延迟完成打印就会被执行。

全局范围用于启动在整个应用程序生命周期内运行且不会提前取消的顶级协程。

【讨论】:

  • 协程如何在一个简单的控制台应用程序中恢复自身,因为没有处理程序和循环器。
  • 在任何JVM应用程序中仍然存在线程blog.jamesdbloom.com/JVMInternals.html
【解决方案2】:
GlobalScope.launch {
   delay(2000)
   print("World)
}
println("Hello")
Thread.sleep(3000)

无需过多介绍使用continuationstate-machine 执行协程suspend/resume 的细节

延迟后协程如何恢复执行

因为,你是blocking 主线程。 Thread.sleep(3000) 阻塞主线程 3 秒。如果您删除Thread.sleep,您可以看到差异。

在 android 中它不是必需的,因为 android UI 线程在 Handler/Looper 概念上运行,这与任何其他线程相同,唯一不同的是,它始终保持 Main/UI 线程处于活动状态并继续执行来自message-queue

【讨论】:

    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 2019-05-17
    • 2013-05-10
    • 2021-12-06
    • 1970-01-01
    • 2021-08-13
    • 2019-11-26
    • 1970-01-01
    相关资源
    最近更新 更多