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

时间:2018-01-05 10:47:17

标签: kotlin coroutine

我一直试图找到解释为什么这在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个线程。
  3. 在kotlin中这个进程并行处理多个线程。

    为什么这样做?

1 个答案:

答案 0 :(得分:3)

map调用在forEach之前终止,因此每个launch将在第一个join(内部forEach)之前调用。这些集合操作不像Java的Streams那样工作。请阅读此answer以获取更多信息。

在Kotlin,就像这样:

  • launch coroutine 1-100
  • join coroutine 1-100