Bird
Raised Fist0
Kotlinprogramming~5 mins

Launch coroutine builder in Kotlin - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Launch coroutine builder
O(n)
Understanding Time Complexity

When we use the launch coroutine builder in Kotlin, it starts a new task that runs alongside other code.

We want to understand how the time it takes to start and run these tasks changes as we start more of them.

Scenario Under Consideration

Analyze the time complexity of the following code snippet.

import kotlinx.coroutines.*

fun main() = runBlocking {
    repeat(5) { i ->
        launch {
            println("Task $i running")
            delay(100L)
        }
    }
}

This code starts 5 coroutines that each print a message and wait briefly.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The repeat(5) loop that launches 5 coroutines.
  • How many times: Exactly 5 times, once per coroutine started.
How Execution Grows With Input

As the number of coroutines started increases, the total number of launch operations grows directly with it.

Input Size (n)Approx. Operations
1010 launches
100100 launches
10001000 launches

Pattern observation: The work grows in a straight line as you add more coroutines.

Final Time Complexity

Time Complexity: O(n)

This means the time to start all coroutines grows directly with the number of coroutines you launch.

Common Mistake

[X] Wrong: "Starting many coroutines happens instantly and does not add up."

[OK] Correct: Each coroutine launch takes some time, so starting more coroutines adds more work overall.

Interview Connect

Understanding how launching many coroutines affects performance helps you write responsive and efficient Kotlin programs.

Self-Check

"What if we replaced launch with async? How would the time complexity change?"

Practice

(1/5)
1. What does the launch coroutine builder do in Kotlin?
easy
A. Starts a new coroutine that runs independently without blocking the current thread.
B. Blocks the current thread until the coroutine completes.
C. Returns a value from the coroutine immediately.
D. Creates a new thread for each coroutine.

Solution

  1. Step 1: Understand the purpose of launch

    The launch builder starts a coroutine that runs concurrently without blocking the current thread.
  2. Step 2: Compare with other coroutine builders

    Unlike async, launch does not return a result and does not block the thread.
  3. Final Answer:

    Starts a new coroutine that runs independently without blocking the current thread. -> Option A
  4. Quick Check:

    launch = independent coroutine start [OK]
Hint: Remember: launch starts, doesn't block or return value [OK]
Common Mistakes:
  • Thinking launch blocks the thread
  • Expecting launch to return a value
  • Confusing launch with thread creation
2. Which of the following is the correct syntax to launch a coroutine in Kotlin?
easy
A. launch: { println("Hello") }
B. launch { println("Hello") }
C. launch -> println("Hello")
D. launch() println("Hello")

Solution

  1. Step 1: Recall the syntax of launch

    The launch builder requires a lambda block enclosed in curly braces.
  2. Step 2: Check each option

    launch { println("Hello") } correctly uses launch { ... }. Others have syntax errors or wrong symbols.
  3. Final Answer:

    launch { println("Hello") } -> Option B
  4. Quick Check:

    Correct coroutine launch syntax = launch { println("Hello") } [OK]
Hint: Use curly braces {} after launch for the coroutine block [OK]
Common Mistakes:
  • Omitting curly braces
  • Using parentheses without braces
  • Using arrow or colon incorrectly
3. What will be the output of this Kotlin code snippet?
import kotlinx.coroutines.*
fun main() = runBlocking {
    launch {
        delay(100)
        println("World")
    }
    println("Hello")
}
medium
A. World\nHello
B. Hello
C. Hello\nWorld
D. World

Solution

  1. Step 1: Analyze the order of execution

    The launch coroutine delays 100ms before printing "World". Meanwhile, println("Hello") runs immediately.
  2. Step 2: Understand runBlocking behavior

    runBlocking waits for all child coroutines to complete before exiting, so both prints occur.
  3. Final Answer:

    Hello World -> Option C
  4. Quick Check:

    Immediate print then delayed print = Hello\nWorld [OK]
Hint: Immediate prints appear before delayed ones in launch [OK]
Common Mistakes:
  • Assuming launch blocks main thread
  • Expecting 'World' before 'Hello'
  • Ignoring delay effect
4. Identify the error in this Kotlin coroutine code:
fun main() = runBlocking {
    launch {
        delay(100)
        println("Done")
    }
    cancel()
    println("Cancelled")
}
medium
A. println("Cancelled") should be inside launch.
B. delay() cannot be used inside launch.
C. launch must return a value.
D. Calling cancel() cancels the runBlocking scope immediately, so "Done" is never printed.

Solution

  1. Step 1: Understand cancel() effect on runBlocking

    Calling cancel() cancels the entire coroutine scope immediately, stopping child coroutines.
  2. Step 2: Check output consequences

    Because of cancellation, the launched coroutine does not complete, so "Done" is not printed, but "Cancelled" is printed after cancel.
  3. Final Answer:

    Calling cancel() cancels the runBlocking scope immediately, so "Done" is never printed. -> Option D
  4. Quick Check:

    cancel() stops coroutines immediately = Calling cancel() cancels the runBlocking scope immediately, so "Done" is never printed. [OK]
Hint: cancel() stops all coroutines in the scope immediately [OK]
Common Mistakes:
  • Thinking delay() is invalid in launch
  • Expecting launch to return a value
  • Assuming println after cancel won't run
5. You want to launch multiple coroutines that print numbers 1 to 3 with a delay, but ensure the main program waits for all to finish. Which code correctly achieves this?
hard
A. runBlocking { repeat(3) { i -> launch { delay(100L * i) println(i + 1) } } }
B. runBlocking { repeat(3) { i -> launch { delay(100L * i) println(i + 1) } } println("Done") }
C. repeat(3) { i -> launch { delay(100L * i) println(i + 1) } } println("Done")
D. runBlocking { repeat(3) { i -> launch { delay(100L * i) println(i + 1) } } delay(400) }

Solution

  1. Step 1: Ensure main waits for coroutines

    Using runBlocking with launch inside ensures the main thread waits for all launched coroutines to complete.
  2. Step 2: Check each option's behavior

    runBlocking { repeat(3) { i -> launch { delay(100L * i) println(i + 1) } } } launches coroutines inside runBlocking, so main waits. runBlocking { repeat(3) { i -> launch { delay(100L * i) println(i + 1) } } println("Done") } prints "Done" immediately without waiting. repeat(3) { i -> launch { delay(100L * i) println(i + 1) } } println("Done") launches outside runBlocking, so main exits early. runBlocking { repeat(3) { i -> launch { delay(100L * i) println(i + 1) } } delay(400) } uses delay but is less reliable than waiting for coroutines.
  3. Final Answer:

    runBlocking with launch inside to wait for all coroutines. -> Option A
  4. Quick Check:

    runBlocking + launch inside = wait for all [OK]
Hint: Use runBlocking to wait for all launched coroutines [OK]
Common Mistakes:
  • Launching coroutines outside runBlocking
  • Printing before coroutines finish
  • Using delay to wait instead of structured concurrency
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard