В этом руководстве мы рассмотрим, как запускать группу задач параллельно и ожидать их завершения. Вместо потоков мы будем использовать корутины, поскольку это рекомендуемый способ реализации конкурентности в Kotlin.
Функция async в Kotlin позволяет запускать конкурентные корутины и возвращает результат типа Deferred<T>.
Deferred — это неблокирующий, отменяемый future-объект, который представляет результат, изначально неизвестный. Например, вызвав метод await у Deferred, мы ждём завершения задачи и затем получаем результат. Если у нас есть коллекция Deferred, мы можем использовать расширение awaitAll, чтобы дождаться завершения всех: @Test
fun whenAwaitAsyncCoroutines_thenAllTerminated() {
val count = AtomicInteger()
runBlocking {
val tasks = listOf(
async(Dispatchers.IO) { count.addAndGet(longRunningTask()) },
async(Dispatchers.IO) { count.addAndGet(longRunningTask()) }
)
tasks.awaitAll()
Assertions.assertEquals(2, count