当前位置: 首页 > 知识库问答 >
问题:

一个Coroutine Continuation内部如何工作?

颛孙安康
2023-03-14

我已经使用coroutine几周了,有时很难理解线程并发和coroutine并发之间的真正工作差异。

挂起函数如何在内部工作?继续块如何帮助暂停后恢复计算。对coroutine内的代码行的顺序计算如何不阻塞线程?它比线程并发有何优势?

共有1个答案

都浩淼
2023-03-14

挂起函数如何在内部工作?

简而言之,在Java平台上,suspend fun编译成字节码,这与普通函数有很大不同。它接收一个隐藏的额外参数(the continuation),创建自己的continuation对象,函数的整个主体(大约)被实现为一个大的switch语句,该语句允许函数在恢复时跳到主体的中间。

挂起fun挂起时,底层Java方法实际上会返回。返回值是一个特殊的coroutine_suspende单例对象,框架知道如何解释该对象。suspend fun本身负责保存continuation对象,当函数的结果准备就绪时,该对象可以访问。

这与我上面所说的有关,suspend fun本身负责确保稍后恢复。它必须在函数suspendcoroutineorreturn提供的块内完成该操作。用户代码不直接调用它,而是更高级别的类似函数suspendcoroutinesuspendcancellablecoroutine。它们将接管在适当的线程上恢复coroutine的工作,开发人员只负责确保在结果可用时调用continuation.resume()。这通常发生在传递给异步调用的回调中。

您可以研究这个答案,它试图在一个自包含的示例中解释挂起-恢复机制。

对coroutine内的代码行的顺序计算如何不阻塞线程?

 类似资料:
  • 问题内容: 我正在使用Eclipse服务器功能进行热代码部署。使用tomcat作为Web服务器。但是我不确定它是如何工作的。我有自己的理解,它必须如何在内部工作。 我的理解:- 当开发人员更改代码(例如,类Employee)时,Eclipse将在正确的位置(必须是特定的Web /应用服务器,将其称为热部署目录(HDD))放置/发布修改后的已编译类。 。现在将显示Web服务器特定的类加载器。它在HD

  • 问题内容: 我正在阅读有关Java中并发性的Oracle官方文档,但我想知道返回的返回值之间可能有什么区别? 并使用例如 。我假设我用一个。我知道,一般而言,同步集合对于我来说只是一个装饰器,因此很明显a 的内部结构有所不同。您是否有关于这些实施细节的信息? 编辑:我意识到源代码是公开可用的: ConcurrentHashMap.java 问题答案: 我会阅读ConcurrentHashMap的源

  • 问题内容: “现代” 守护程序如何在 内部 安排作业?有些人经常通过来安排一次跑步。因此,在写出crontab之后,会执行以下操作: 解析crontab以了解所有将来的事件,并hibernate间隔时间? 每分钟轮询一次汇总的crontab数据库,以确定当前时间是否与计划模式匹配? 其他? 谢谢, 问题答案: 在这个问题上听到了几声。不错的RTFC,其中包含一些离散事件模拟论文和Wikipedia

  • 我正在阅读关于从内部类继承的内容,我一直在努力理解下面的代码是如何工作的: 据我所知,关键字Super指的是超类,Super()指的是它没有参数构造函数。在外层类的情况下,超类是Object类。 我想了解一下,这段代码是如何工作的。 为什么Object类的实例化使扩展内部类成为可能? 创建Object类实例与创建外层类对象有什么关系? 删除包含"o.super();"的行会导致错误: java:包

  • 问题内容: 该功能在内部如何工作?考虑到内核确实具有访问用户内存空间的特权,它是否使用任何缓冲区还是完成了任何内存映射? 问题答案: 的实现高度依赖于体系结构。 在x86和x86-64上,它只是直接从用户空间地址进行读取并写入内核空间地址,同时如果已配置,则暂时禁用SMAP(超级用户模式访问阻止)。它的棘手部分是将代码放置在特殊区域中,以便页面错误处理程序可以识别其中何时发生错误。发生的内存保护错

  • 问题内容: “类(及其子类)的每个实例都具有一个锁,该锁在方法进入时获得,并在退出时自动释放” 这是否意味着我们创建的任何对象实例默认情况下内部都具有“锁”(实现为字段)? 我对这个“锁”概念感到困惑,我想知道它实际上在内部做什么。 有人可以将我引导到一些我可以找到更多信息的地方吗? 问题答案: 与往常一样,JLS提供了答案(17.1): 这些方法中最基本的是同步,它是使用监视器实现的。Java中