728x90
반응형
이번에는 Thread에서 전통적으로 사용하는 sleep(blocking)과
Coroutines에서 사용하는 delay(suspending)의 차이에 대해 적어본다.
Thread의 blocking
먼저 스레드로 blocking하는 예시를 보도록 하자.
fun main() {
println("main starts")
threadRoutine(1, 500)
threadRoutine(2, 300)
Thread.sleep(1000)
println("main ends")
}
fun threadRoutine(number: Int, delay: Long) {
thread {
println("thread $number starts work")
Thread.sleep(delay)
println("thread $number has finished")
}
}
이 코드의 실행 결과는 어떨까?
아래 그림으로 대체할 수 있겠다.
짧게 설명을 첨부해보자면 이 코드가 실행 중일 때, Thread가 아무런 작업을 할 수 없는 구간이 군데군데 있다.
특히 Main Thread가 sleep에 들어가게 되면 안드로이드에서는 UI 작업 자체를 멈춰버리기 때문에
일반 사용자들이 느끼기엔 "렉 걸렸다" 고 느낄 수 있다.
Coroutines의 suspending
이번엔 코루틴으로 suspending하는 예제를 보도록 하자.
fun main() = runBlocking {
println("main starts")
joinAll(
async { threadInfoCoroutine(1, 500) },
async { threadInfoCoroutine(2, 300) }
)
println("main ends")
}
suspend fun threadInfoCoroutine(number: Int, delay: Long) {
println("Coroutine $number starts work on ${Thread.currentThread().name}")
delay(delay)
println("Coroutine $number has finished on ${Thread.currentThread().name}")
}
이번 코드의 실행 결과는 어떨까?
그림으로 확인해보자.
이 그림과 이전 그림을 비교하면 다들 이해하겠지만 코루틴에서는 delay를 사용해 특정 작업을 지연시킬 때,
메인 스레드는 blocking되지 않는다.
delay가 호출되면 각 코루틴이 잠시 중단되고 이 때 메인 스레드는 다른 작업을 실행할 수 있다.
또한 코루틴의 작업은 현재 메인 스레드에서 실행되고 있다.
반면 스레드로 실행한 예시는 각 스레드에서 print 문을 실행하고 있다.
정리
전통적인 스레드의 sleep 방식으로는 메인 혹은 특정 스레드가 작업을 실행할 수 없는 시간이 생긴다.
반면, 코루틴의 delay 방식으로는 메인 혹은 특정 스레드가 작업을 실행할 수 없는 시간이 생기지 않는다.
728x90
반응형
'Language > Kotlin' 카테고리의 다른 글
Coroutines의 내부 동작 (0) | 2024.03.07 |
---|---|
Coroutines을 다른 스레드에서 실행하기 (0) | 2024.03.03 |
Thread와 Coroutines 비교 (0) | 2024.02.22 |
Suspend function 짧은 소개 (0) | 2024.01.19 |
Android에서 Kotlin을 사용할 때 이점(JetBrains피셜) (0) | 2022.08.18 |