728x90
반응형
이번 글은 저번 글 문맥이 살짝 섞여있는데, 간단히 말해 저번 글에서는 코루틴을 메인 스레드에서만 실행했다.
그래서 이번 글에서는 코루틴을 다른 스레드에서 실행해보려고 한다.
다른 스레드에서 코루틴 실행하기
바로 예제를 통해 알아보자.
fun main() = runBlocking {
println("main starts")
joinAll(
async { threadSwitchingCoroutine(1, 500) },
async { threadSwitchingCoroutine(2, 300) }
)
println("main ends")
}
suspend fun threadSwitchingCoroutine(number: Int, delay: Long) {
println("Coroutine $number starts work on ${Thread.currentThread().name}")
delay(delay)
withContext(Dispatchers.Default) {
println("Coroutine $number starts finished ${Thread.currentThread().name}")
}
}
이 코드의 실행결과를 보면 아래와 같을 것이다.
main starts
Coroutine1 starts work on main
Coroutine2 starts work on main
Coroutine2 has finished on DefaultDispatcher-worker-1
Coroutine1 has finished on DefaultDispatcher-worker-1
main ends
어떻게 이런 결과가 나올 수 있었을까?
threadSwitchingCoroutine 함수에서 withContext 함수를 사용할 때, Dispatcher를 Default로 주었기 때문이다.
그렇게 println이 다른 스레드에서 실행된 것이다.
근데 굳이 스레드를 변경해야하는 이유가 뭐야?
라고 생각할 수 있겠다.
그 이유는 때때로 우리는 코루틴안에서 blocking을 사용해야할 때가 있기 때문이다.
예를 들면 무거운 계산을 하거나, 큰 파일을 읽는 등의 동작이 있겠다.
이런 동작은 우리가 메인 스레드에서 수행하지 않고 백그라운드 스레드에서 수행하기 원할 것이다.
그 이유는 또 지겹게 나오는 UI 동작이나 반응이 멈출 수 있기 때문이다.
728x90
반응형
'Language > Kotlin' 카테고리의 다른 글
Coroutine Builder 이해하기 (0) | 2024.05.02 |
---|---|
Coroutines의 내부 동작 (0) | 2024.03.07 |
Blocking vs Suspending 차이점 (0) | 2024.03.01 |
Thread와 Coroutines 비교 (0) | 2024.02.22 |
Suspend function 짧은 소개 (0) | 2024.01.19 |