Bird
Raised Fist0
Kotlinprogramming~10 mins

Coroutine context and dispatchers in Kotlin - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to launch a coroutine on the IO dispatcher.

Kotlin
GlobalScope.launch([1]) {
    println("Running in IO dispatcher")
}
Drag options to blanks, or click blank then click option'
ADispatchers.Default
BDispatchers.Main
CDispatchers.IO
DDispatchers.Unconfined
Attempts:
3 left
💡 Hint
Common Mistakes
Using Dispatchers.Main for IO tasks causes blocking on the main thread.
Using Dispatchers.Default is for CPU-intensive tasks, not IO.
2fill in blank
medium

Complete the code to switch the coroutine context to the Default dispatcher.

Kotlin
withContext([1]) {
    println("Running in Default dispatcher")
}
Drag options to blanks, or click blank then click option'
ADispatchers.IO
BDispatchers.Default
CDispatchers.Main
DDispatchers.Unconfined
Attempts:
3 left
💡 Hint
Common Mistakes
Using Dispatchers.IO for CPU tasks is inefficient.
Dispatchers.Main is for UI thread, not CPU work.
3fill in blank
hard

Fix the error in the coroutine builder to use the correct dispatcher for UI updates.

Kotlin
GlobalScope.launch([1]) {
    // Update UI here
    println("Updating UI")
}
Drag options to blanks, or click blank then click option'
ADispatchers.Main
BDispatchers.Default
CDispatchers.Unconfined
DDispatchers.IO
Attempts:
3 left
💡 Hint
Common Mistakes
Using Dispatchers.IO or Default causes exceptions when updating UI.
Unconfined dispatcher may run on any thread, unsafe for UI.
4fill in blank
hard

Fill both blanks to create a coroutine context combining a Job and the Default dispatcher.

Kotlin
val job = Job()
val context = job + [1]

GlobalScope.launch(context) {
    println("Running with combined context")
}
Drag options to blanks, or click blank then click option'
ADispatchers.Default
BDispatchers.IO
CDispatchers.Main
DDispatchers.Unconfined
Attempts:
3 left
💡 Hint
Common Mistakes
Using Dispatchers.IO here is for IO, not CPU work.
Dispatchers.Main is for UI, not combined with Job for CPU tasks.
5fill in blank
hard

Fill all three blanks to create a coroutine that runs on the IO dispatcher, with a SupervisorJob and a custom CoroutineName.

Kotlin
val supervisor = [1]()
val context = supervisor + [2] + [3]("MyCoroutine")

GlobalScope.launch(context) {
    println("Running supervised coroutine with name")
}
Drag options to blanks, or click blank then click option'
AJob
BDispatchers.IO
CCoroutineName
DSupervisorJob
Attempts:
3 left
💡 Hint
Common Mistakes
Using Job instead of SupervisorJob loses supervision benefits.
Using Dispatchers.Default instead of IO changes the thread pool.
Forgetting CoroutineName loses coroutine identification.

Practice

(1/5)
1. Which dispatcher should you use in Kotlin coroutines to perform heavy CPU-intensive tasks?
easy
A. Dispatchers.Default
B. Dispatchers.IO
C. Dispatchers.Main
D. Dispatchers.Unconfined

Solution

  1. Step 1: Understand dispatcher roles

    Dispatchers.Default is designed for CPU-intensive work like calculations.
  2. Step 2: Match task type to dispatcher

    Heavy CPU tasks should use Dispatchers.Default to avoid blocking UI or IO threads.
  3. Final Answer:

    Dispatchers.Default -> Option A
  4. Quick Check:

    CPU work = Dispatchers.Default [OK]
Hint: Use Default for CPU tasks, IO for disk/network, Main for UI [OK]
Common Mistakes:
  • Using Dispatchers.IO for CPU tasks
  • Using Dispatchers.Main for background work
  • Confusing Dispatchers.Unconfined with Default
2. Which of the following is the correct syntax to launch a coroutine on the IO dispatcher in Kotlin?
easy
A. launch(Dispatchers.Background) { /* code */ }
B. launch(Dispatchers.Default) { /* code */ }
C. launch(Dispatchers.Main) { /* code */ }
D. launch(Dispatchers.IO) { /* code */ }

Solution

  1. Step 1: Identify correct dispatcher name

    Dispatchers.IO is the correct dispatcher for IO tasks.
  2. Step 2: Check syntax correctness

    launch(Dispatchers.IO) { /* code */ } is valid Kotlin coroutine syntax.
  3. Final Answer:

    launch(Dispatchers.IO) { /* code */ } -> Option D
  4. Quick Check:

    IO dispatcher syntax = launch(Dispatchers.IO) { /* code */ } [OK]
Hint: Use Dispatchers.IO exactly as shown to launch IO coroutines [OK]
Common Mistakes:
  • Using non-existent Dispatchers.Background
  • Mixing up Dispatchers.Default and Dispatchers.IO
  • Forgetting braces or parentheses
3. What will be the output of this Kotlin coroutine code snippet?
import kotlinx.coroutines.*

fun main() = runBlocking {
    launch(Dispatchers.Default) {
        println("Running on: " + Thread.currentThread().name)
    }.join()
}
medium
A. Running on: DefaultDispatcher-worker-1
B. Running on: main
C. Running on: IO-thread-1
D. Running on: Unconfined

Solution

  1. Step 1: Identify dispatcher thread naming

    Dispatchers.Default uses a shared pool named like DefaultDispatcher-worker-n.
  2. Step 2: Check printed thread name

    The coroutine runs on a background thread named DefaultDispatcher-worker-1 or similar.
  3. Final Answer:

    Running on: DefaultDispatcher-worker-1 -> Option A
  4. Quick Check:

    Default dispatcher thread name = Running on: DefaultDispatcher-worker-1 [OK]
Hint: Default dispatcher runs on worker threads, not main [OK]
Common Mistakes:
  • Assuming it runs on main thread
  • Confusing IO dispatcher thread names
  • Expecting Unconfined dispatcher output
4. Identify the error in this Kotlin coroutine code snippet:
fun main() = runBlocking {
    launch(Dispatchers.Main) {
        println("Hello from Main")
    }
}
medium
A. println is not allowed inside coroutines
B. Dispatchers.Main cannot be used in runBlocking without a UI environment
C. launch must be called with Dispatchers.Default
D. Missing join() call on launched coroutine

Solution

  1. Step 1: Understand Dispatchers.Main requirements

    Dispatchers.Main requires a UI thread environment (like Android or JavaFX).
  2. Step 2: Check runBlocking context

    runBlocking runs on the main thread but usually outside UI context, so Dispatchers.Main is invalid here.
  3. Final Answer:

    Dispatchers.Main cannot be used in runBlocking without a UI environment -> Option B
  4. Quick Check:

    Main dispatcher needs UI thread = Dispatchers.Main cannot be used in runBlocking without a UI environment [OK]
Hint: Use Dispatchers.Main only in UI apps with proper environment [OK]
Common Mistakes:
  • Assuming Dispatchers.Main works everywhere
  • Forgetting to join coroutine before main ends
  • Thinking println is disallowed in coroutines
5. You want to perform a network request in a Kotlin coroutine and then update the UI with the result. Which dispatcher combination should you use to ensure correct threading?
hard
A. launch(Dispatchers.Default) { val data = fetchData(); updateUI(data) }
B. launch(Dispatchers.Main) { val data = fetchData(); updateUI(data) }
C. launch(Dispatchers.IO) { val data = fetchData(); withContext(Dispatchers.Main) { updateUI(data) } }
D. launch(Dispatchers.IO) { val data = fetchData(); updateUI(data) }

Solution

  1. Step 1: Identify correct dispatcher for network request

    Network requests should run on Dispatchers.IO to avoid blocking the main thread.
  2. Step 2: Switch to Main dispatcher for UI update

    UI updates must happen on Dispatchers.Main to safely update UI components.
  3. Step 3: Analyze code structure

    launch(Dispatchers.IO) { val data = fetchData(); withContext(Dispatchers.Main) { updateUI(data) } } correctly uses Dispatchers.IO for fetching and withContext(Dispatchers.Main) for UI update.
  4. Final Answer:

    launch(Dispatchers.IO) { val data = fetchData(); withContext(Dispatchers.Main) { updateUI(data) } } -> Option C
  5. Quick Check:

    IO for network + Main for UI = launch(Dispatchers.IO) { val data = fetchData(); withContext(Dispatchers.Main) { updateUI(data) } } [OK]
Hint: Use IO for background, switch to Main for UI updates [OK]
Common Mistakes:
  • Updating UI on IO or Default dispatcher
  • Running network request on Main dispatcher
  • Not switching context before UI update
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