Sample of using a coroutines in Kotlin

Call suspend function in Kotlin.

Tiny project with sample of call a suspend function in Kotlin.

Links:

Piece of code:

package com.gitlab.denissov.kcoroutines

import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking

fun main() = runBlocking {
    val operationsCount = 0..5
    fixExecutionTime("synchronous") {
        operationsCount.forEach { index ->
            println(longTimeMethod("A", index))
            println(longTimeMethod("B", index))
        }
    }
    fixExecutionTime("asynchronous") {
        operationsCount.forEach { index ->
            val resultA = async { longTimeMethod("A", index) }
            val resultB = async { longTimeMethod("B", index) }
            awaitAll(resultA, resultB).forEach {
                println(it)
            }
        }
    }
    fixExecutionTime("asynchronous all") {
        val results = operationsCount.map { index ->
            listOf(
                async {
                    longTimeMethod("A", index)
                },
                async {
                    longTimeMethod("B", index)
                }
            )
        }.flatten()

        awaitAll(*results.toTypedArray()).forEach {
            println(it)
        }
    }
}

private suspend fun longTimeMethod(prefix: String, index: Int): String {
    // Simulate waiting for a network request to respond or performing complex work on the CPU
    delay(1_000)
    return shortTimeMethod(prefix, System.currentTimeMillis(), index)
}

private fun shortTimeMethod(prefix: String, time: Long, index: Int): String =
    "Call $prefix:$index returns result at $time ms"

private suspend fun fixExecutionTime(blockName: String, block: suspend () -> Unit) {
    val startTime = System.currentTimeMillis()
    println("start: $blockName")
    block()
    println("complete $blockName execution time: ${System.currentTimeMillis() - startTime} ms")
}

Result:

start: synchronous
Call A:0 returns result at 1584528958292 ms
Call B:0 returns result at 1584528959294 ms
Call A:1 returns result at 1584528960297 ms
Call B:1 returns result at 1584528961298 ms
Call A:2 returns result at 1584528962302 ms
Call B:2 returns result at 1584528963305 ms
Call A:3 returns result at 1584528964309 ms
Call B:3 returns result at 1584528965310 ms
Call A:4 returns result at 1584528966311 ms
Call B:4 returns result at 1584528967313 ms
Call A:5 returns result at 1584528968315 ms
Call B:5 returns result at 1584528969317 ms
complete synchronous execution time: 12028 ms
start: asynchronous
Call A:0 returns result at 1584528970328 ms
Call B:0 returns result at 1584528970328 ms
Call A:1 returns result at 1584528971333 ms
Call B:1 returns result at 1584528971333 ms
Call A:2 returns result at 1584528972336 ms
Call B:2 returns result at 1584528972337 ms
Call A:3 returns result at 1584528973338 ms
Call B:3 returns result at 1584528973338 ms
Call A:4 returns result at 1584528974343 ms
Call B:4 returns result at 1584528974343 ms
Call A:5 returns result at 1584528975345 ms
Call B:5 returns result at 1584528975345 ms
complete asynchronous execution time: 6027 ms
start: asynchronous all
Call A:0 returns result at 1584528976366 ms
Call B:0 returns result at 1584528976366 ms
Call A:1 returns result at 1584528976366 ms
Call B:1 returns result at 1584528976366 ms
Call A:2 returns result at 1584528976366 ms
Call B:2 returns result at 1584528976366 ms
Call A:3 returns result at 1584528976366 ms
Call B:3 returns result at 1584528976366 ms
Call A:4 returns result at 1584528976366 ms
Call B:4 returns result at 1584528976367 ms
Call A:5 returns result at 1584528976367 ms
Call B:5 returns result at 1584528976367 ms
complete asynchronous all execution time: 1020 ms

Code available at Repository