9
|
Archie G. Quiñones · 技术社区 · 6 年前 |
1
62
虽然上面描述了概念上的相似性,但也应该向您展示
|
2
32
选择的答案很好,但未能解决所提供示例代码的其他一些重要方面。例如,启动是非阻塞的,并且应该立即执行。这根本不是事实。启动本身会立即返回,但启动中的代码看起来确实被放入了队列中,并且只有在之前放入队列的任何其他启动完成时才会执行。 下面是一段类似的示例代码,删除了所有延迟,并包含了一个额外的启动。不看下面的结果,看看是否可以预测数字的打印顺序。你很可能会失败:
结果是:
这是您得到的结果:
添加CoroutineScope将破坏此行为。它将导致在CoroutineScope之前的所有代码完成之前,不会执行CoroutineScope之后的所有非阻塞代码。 还应该注意,在这个代码示例中,队列中的每个启动都是按照它们添加到队列中的顺序依次执行的,并且每个启动将仅在前一次启动执行之后执行。这可能会使所有启动看起来共享一个公共线程。事实并非如此。他们每个人都有自己的线索。但是,如果启动中的任何代码调用挂起函数,则在执行挂起函数时,队列中的下一次启动将立即启动。老实说,这是非常奇怪的行为。为什么不异步运行队列中的所有启动?虽然我不知道队列中发生了什么,但我猜队列中的每个启动都没有自己的线程,而是共享一个公共线程。只有在遇到挂起函数时,才会为队列中的下一次启动创建新线程。这样做可以节省资源。 总之,执行顺序如下:
|
3
14
coroutineScope用于阻止运行阻塞。 |
4
7
弗斯特
但是嵌套的
|
5
2
好吧,在阅读了这里的所有答案之后,我发现除了重复文档片段的措辞之外,没有人回答这个问题。
因此,我继续在别处寻找答案,并找到了它
here
. 它实际上显示了不同的行为
|
6
1
https://jivimberg.io/blog/2018/05/04/parallel-map-in-kotlin/
|
Expert wanna be · 具有返回值的Kotlin协程 7 年前 |