Почему эти две функции приостановки могут работать без запуска или ayn c в Kotlin? - PullRequest
0 голосов
/ 19 марта 2020

Я изучаю сопрограммы Kotlin, я запускаю Код A и получаю Результат A .

1: Мне очень странно, почему две функции приостановки doJob1() и doJob2() могут работать без launch или aync. Вы знаете, нормальный случай - это как Код 1 .

2: Я думаю, что Результат B будет ожидаемым, если Код A может работать. Поскольку код delay(3000L) в doJob1() равен 3 с, поэтому сначала будет выполняться doJob2().

Код A

import kotlinx.coroutines.*
import kotlin.system.*

fun main() = runBlocking {
    val time = measureTimeMillis {
        val one = doJob1()
        val two = doJob2()
        println("[testSequential] Result ${one + two}")
    }
    println("[testSequential] Completed in $time ms")   
}


suspend fun doJob1(): Int {
    println("Job1 Doing")
    delay(3000L) 
    println("Job1 Done")
    return 10
}

suspend fun doJob2(): Int {
    println("Job2 Doing")
    delay(1000L) 
    println("Job2 Done")
    return 20
}

Результат A

Job1 Doing
Job1 Done
Job2 Doing
Job2 Done
[testSequential] Result 30
[testSequential] Completed in 4011 ms

Результат B

Job1 Doing
Job2 Doing
Job2 Done
Job1 Done
[testSequential] Result 30
[testSequential] Completed in 4011 ms

Код 1

fun main() = runBlocking {
    launch { doWorld() }  // It use launch
    println("Hello,")
}


suspend fun doWorld() {
    delay(1000L)
    println("World!")
}

1 Ответ

2 голосов
/ 19 марта 2020

runBlocking запускает сопрограмму, поэтому вы можете вызывать функции приостановки из ее блока.

Ваш код вызывает doJob1() и doJob2() последовательно, поэтому они выполняются в этой последовательности. Если вы хотите, чтобы они запускались одновременно, вам нужно запустить новые сопрограммы, используя async или launch, чтобы запустить каждую из них.

...