在Kotlin协同程序中启动/连接和异步/等待之间有什么区别?

kotlinx.coroutines库中,您可以使用launch (使用kotlinx.coroutines )或async (使用await )来启动新协程。 他们有什么区别?

  • launch是用来发射和忘记协同程序 。 这就像开始一个新的线程。 如果launch的代码以异常终止,那么它将被视为线程中未捕获的异常 – 通常在后端JVM应用程序中将其打印到stderr,并使Android应用程序崩溃。 join用于等待启动的协程完成,并不传播其异常。 但是,一个崩溃的协程也取消了它的父类,也有相应的例外情况。

  • async用于启动计算一些结果的协程 。 结果由Deferred实例表示,您必须使用awaitasync代码中的未捕获异常存储在生成的Deferred内部,不会在其他任何地方传递,除非进行处理,否则它将被自动丢弃。 你不能忘记你开始使用异步的协程