为什么operation.map(启动线程).foreach(join())在kotlin中工作?

我一直在试图find一个解释,为什么这在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这个进程并行的multithreading。

为什么这个工作?

map调用在forEach之前终止,因此每次launch都会在第一次join之前调用(在forEach )。 这些收集操作不像Java的Streams那样工作。 阅读此答案以获取更多信息。

在Kotlin里是这样的:

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