Параллельный результат в Kotlin
Когда нужен не только факт завершения, но и
результат вычисления, launch заменяют на
async. Он тоже стартует корутину, но
возвращает Deferred - дескриптор с
будущим значением. Метод await
приостанавливает вызывающую корутину, пока
результат не будет готов.
Два независимых расчета удобно запустить параллельно
и сложить ответы после обоих await:
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val left = async {
delay(50)
3
}
val right = async {
delay(50)
4
}
val sum = left.await() + right.await()
println(sum)
}
}
Пока обе задачи ждут паузу, они идут одновременно.
В консоли появляется 7 - сумма готовых
чисел, а не время двух пауз подряд.
Тот же прием работает со строками и другими типами, если лямбда возвращает значение:
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val partA = async { "co" }
val partB = async { "de" }
val word = partA.await() + partB.await()
println(word)
}
}
Параллельно получите числа 10 и 25
в двух фоновых вычислениях с короткой паузой
в каждом. Выведите их произведение.
Две задачи возвращают строки "run" и
"ner". Склейте результаты и напечатайте
получившееся слово.