Bird
Raised Fist0
Kotlinprogramming~10 mins

Delay vs Thread.sleep in Kotlin - Visual Side-by-Side Comparison

Choose your learning style10 modes available
Concept Flow - Delay vs Thread.sleep
Start Coroutine
↓
Call delay(1000)
↓
Coroutine Suspends
↓
Other coroutines run
↓
After 1 second
↓
Coroutine Resumes
↓
Continue execution
↓
Start Thread
↓
Call Thread.sleep(1000)
↓
Thread Blocks
↓
No other code runs in this thread
↓
After 1 second
↓
Thread wakes up
↓
Continue execution
Shows how delay suspends a coroutine allowing others to run, while Thread.sleep blocks the thread stopping all work on it.
Execution Sample
Kotlin
import kotlinx.coroutines.*

fun main() = runBlocking {
  println("Start")
  delay(1000)
  println("End")
}
This code prints Start, waits 1 second without blocking, then prints End.
Execution Table
StepActionStateOutput
1Start runBlocking coroutineCoroutine activePrints 'Start'
2Call delay(1000)Coroutine suspends, thread freeNo output
3Other coroutines or main thread can runCoroutine suspendedNo output
4After 1 second delay endsCoroutine resumesNo output
5Print 'End'Coroutine activePrints 'End'
6Coroutine completesCoroutine finishedNo output
💡 Coroutine finishes after printing 'End'
Variable Tracker
VariableStartAfter delayAfter resumeFinal
Coroutine StateActiveSuspendedActiveFinished
Key Moments - 3 Insights
Why does delay not block the whole program?
Because delay suspends only the coroutine, freeing the thread to run other coroutines or tasks, as shown in execution_table step 3.
What happens to the thread during Thread.sleep?
The thread is blocked and cannot do any other work until sleep finishes, unlike delay which suspends coroutine but keeps thread free.
Can delay be used outside coroutines?
No, delay is a suspend function and must be called inside a coroutine or another suspend function.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the coroutine state right after calling delay(1000)?
AActive
BSuspended
CFinished
DBlocked
💡 Hint
Check execution_table row 2 under 'State' column
At which step does the coroutine resume after delay?
AStep 2
BStep 3
CStep 4
DStep 5
💡 Hint
Look for 'Coroutine resumes' in execution_table
If Thread.sleep was used instead of delay, what would happen to the thread?
AThread would block and no other code runs on it
BThread would suspend but allow other coroutines
CThread would continue running other coroutines
DThread would crash
💡 Hint
Refer to concept_flow section about Thread.sleep behavior
Concept Snapshot
delay(1000) suspends coroutine without blocking thread
Thread.sleep(1000) blocks the thread completely
Use delay inside coroutines for non-blocking waits
Thread.sleep blocks all work on the thread
delay allows other coroutines to run during wait
Full Transcript
This visual execution compares delay and Thread.sleep in Kotlin. delay suspends a coroutine, freeing the thread to run other coroutines, shown by the coroutine state changing to suspended and resuming after 1 second. Thread.sleep blocks the entire thread, stopping all work on it until the sleep ends. The example code runs a coroutine that prints 'Start', delays 1 second without blocking, then prints 'End'. Key points: delay is non-blocking and must be used inside coroutines; Thread.sleep blocks the thread and should be avoided in coroutines.

Practice

(1/5)
1. What is the main difference between delay and Thread.sleep in Kotlin?
easy
A. Both delay and Thread.sleep block the thread in the same way.
B. delay pauses a coroutine without blocking the thread, while Thread.sleep blocks the thread.
C. delay blocks the thread, while Thread.sleep pauses a coroutine without blocking.
D. delay is used only for UI updates, Thread.sleep is for background tasks.

Solution

  1. Step 1: Understand delay behavior

    delay suspends the coroutine but does not block the underlying thread, allowing other coroutines to run.
  2. Step 2: Understand Thread.sleep behavior

    Thread.sleep blocks the entire thread, stopping all work on that thread until the sleep time ends.
  3. Final Answer:

    delay pauses a coroutine without blocking the thread, while Thread.sleep blocks the thread. -> Option B
  4. Quick Check:

    delay = non-blocking pause, Thread.sleep = blocking pause [OK]
Hint: delay suspends coroutines; Thread.sleep blocks threads [OK]
Common Mistakes:
  • Thinking delay blocks the thread
  • Confusing coroutine suspension with thread blocking
  • Assuming both behave the same way
2. Which of the following is the correct way to use delay in a Kotlin coroutine?
easy
A. Thread.delay(1000)
B. Thread.sleep(1000)
C. delay.sleep(1000)
D. delay(1000)

Solution

  1. Step 1: Recall delay syntax

    delay is a suspend function called with the time in milliseconds as an argument, e.g., delay(1000).
  2. Step 2: Identify incorrect options

    Thread.delay and delay.sleep do not exist. Thread.sleep is a different blocking function.
  3. Final Answer:

    delay(1000) -> Option D
  4. Quick Check:

    Correct syntax for delay = delay(1000) [OK]
Hint: Use delay(milliseconds) inside coroutines only [OK]
Common Mistakes:
  • Using Thread.delay instead of delay
  • Confusing delay with Thread.sleep syntax
  • Calling delay outside coroutine scope
3. What will be the output of this Kotlin coroutine code snippet?
import kotlinx.coroutines.*

fun main() = runBlocking {
    println("Start")
    delay(500)
    println("Middle")
    Thread.sleep(500)
    println("End")
}
medium
A. Start Middle End (with 1 second total delay)
B. Start End Middle (order switched)
C. Start Middle End (with 0.5 second total delay)
D. Start End (missing Middle)

Solution

  1. Step 1: Analyze the coroutine flow

    The program prints "Start", then suspends for 500ms using delay, then prints "Middle".
  2. Step 2: Analyze the thread blocking

    After "Middle", Thread.sleep(500) blocks the thread for 500ms, then prints "End".
  3. Final Answer:

    Start Middle End (with 1 second total delay) -> Option A
  4. Quick Check:

    delay + Thread.sleep = total 1 second pause [OK]
Hint: delay suspends coroutine; Thread.sleep blocks thread sequentially [OK]
Common Mistakes:
  • Assuming delay and Thread.sleep run in parallel
  • Thinking delay blocks the thread
  • Confusing output order
4. Identify the problem in this Kotlin coroutine code and choose the fix:
import kotlinx.coroutines.*

fun main() = runBlocking {
    println("Before sleep")
    Thread.sleep(1000)
    println("After sleep")
}
medium
A. Change Thread.sleep(1000) to Thread.delay(1000) for coroutine compatibility.
B. Add runBlocking inside the main function to fix the error.
C. Replace Thread.sleep(1000) with delay(1000) to avoid blocking the thread.
D. No problem; the code is correct as is.

Solution

  1. Step 1: Identify blocking call in coroutine

    Thread.sleep(1000) blocks the thread, which is not recommended inside coroutines.
  2. Step 2: Suggest coroutine-friendly alternative

    Use delay(1000) to suspend the coroutine without blocking the thread.
  3. Final Answer:

    Replace Thread.sleep(1000) with delay(1000) to avoid blocking the thread. -> Option C
  4. Quick Check:

    Use delay, not Thread.sleep, inside coroutines [OK]
Hint: Avoid Thread.sleep in coroutines; use delay instead [OK]
Common Mistakes:
  • Using Thread.sleep inside coroutines
  • Trying to use Thread.delay which doesn't exist
  • Ignoring thread blocking effects
5. You want to run two tasks concurrently in Kotlin coroutines, each pausing for 1 second. Which approach uses delay correctly to avoid blocking threads and runs tasks concurrently?
fun main() = runBlocking {
    // Choose the correct code snippet
}
hard
A. launch { delay(1000); println("Task 1 done") } launch { delay(1000); println("Task 2 done") }
B. launch { Thread.sleep(1000); println("Task 1 done") } launch { Thread.sleep(1000); println("Task 2 done") }
C. Thread.sleep(1000); println("Task 1 done") Thread.sleep(1000); println("Task 2 done")
D. delay(1000); println("Task 1 done") delay(1000); println("Task 2 done")

Solution

  1. Step 1: Understand concurrency with coroutines

    Using launch starts concurrent coroutines. Inside them, delay suspends without blocking threads.
  2. Step 2: Analyze options for concurrency and blocking

    launch { delay(1000); println("Task 1 done") } launch { delay(1000); println("Task 2 done") } uses delay inside launch, enabling concurrency. launch { Thread.sleep(1000); println("Task 1 done") } launch { Thread.sleep(1000); println("Task 2 done") } blocks threads with Thread.sleep. Thread.sleep(1000); println("Task 1 done") Thread.sleep(1000); println("Task 2 done") blocks main thread sequentially. delay(1000); println("Task 1 done") delay(1000); println("Task 2 done") calls delay outside coroutine scope, causing error.
  3. Final Answer:

    launch { delay(1000); println("Task 1 done") } launch { delay(1000); println("Task 2 done") } -> Option A
  4. Quick Check:

    Use launch + delay for concurrent non-blocking tasks [OK]
Hint: Use launch with delay for concurrency, not Thread.sleep [OK]
Common Mistakes:
  • Using Thread.sleep inside launch blocks threads
  • Calling delay outside coroutine scope
  • Running tasks sequentially blocking main thread
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