Какой возврат будет ждать () в Kotlin? - PullRequest
1 голос
/ 19 марта 2020

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

Я знаю "asyn c используется для запуска сопрограммы, которая вычисляет некоторый результат. Результат представлен экземпляром Deferred.".

Итак, val one вернет Deferred, но что вернет one.await()? Кажется, что one.await() вернет Int, верно?

Код A

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

fun main() = runBlocking {

    val time = measureTimeMillis {
        val one = async { doJob1() }       
        val two = async { doJob2() }
        val a1=one.await()
        val a2=two.await()
        println("[testSequential] Result ${a1+a2}")
    }   
    println("[testSequential] Completed in $time ms")   
}

suspend fun doJob1(): Int {
    println("Job1 doing")
    delay(2000L) 
    println("Job1 done")
    return 10
}

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

Результат A

Job1 doing
Job2 doing
Job2 done
Job1 done
[testSequential] Result 30
[testSequential] Completed in 2016 ms

Ответы [ 2 ]

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

Согласно kotlin Document

async запускается отдельная сопрограмма, представляющая собой легкую нить, которая работает одновременно со всеми остальными сопрограммами.

async возвращает Отложенное - легкое неблокирующее будущее, которое представляет собой обещание предоставить результат позже.

Вы можете использовать .await() для отложенного значения чтобы получить возможный результат, но Deferred также является заданием, поэтому вы можете отменить его, если необходимо.

скажем,

val one = async { Fun() } 
//one is type of Deferred 
val mystring = one.await()
//mystring is type of string

fun Fun(): String{
    return "hello"
}
2 голосов
/ 19 марта 2020

Вам просто нужно посмотреть подпись :

// in Deferred<T>
abstract suspend fun await(): T

Так что при вызове на Deferred<Int> он действительно вернет Int; при вызове, скажем, Deferred<YourVeryUsefulClass> он вернет YourVeryUsefulClass.

...