为什么 operation.map(launch thread).foreach(join()) 在 kotlin 中工作?

why does operation.map(launch thread).foreach(join()) work in kotlin?

我一直在努力寻找关于为什么这在 kotlin 中有效的解释:

(1..100).map {
    launch {
        System.out.println("Hello from on ${Thread.currentThread().name}")
        delay(100)
    }
}.forEach { it.join() }

在 java 这将:

  1. 启动线程 1
  2. 加入线程 1 - 并在此处阻塞,永远不会启动超过 1 个线程。

在 kotlin 中,这个过程在多个线程上并行进行。

为什么这样做?

map 调用在 forEach 之前终止,因此每个 launch 将在第一个 join(在 forEach 内)之前被调用。这些 集合操作 不像 Java 的流那样工作。阅读此 了解更多信息。

在 Kotlin 中是这样的:

  • launch协程1-100
  • join协程1-100