2024. 11. 27. 13:49ㆍKotlin
코틀린(Kotlin)에서 코루틴(Coroutines)은 여러 가지 컨텍스트에서 실행될 수 있으며, 이를 관리하기 위해 Dispatchers
가 사용됩니다. Dispatchers
는 코루틴이 어떤 스레드 또는 스레드 풀에서 실행될지를 결정합니다. 코틀린 표준 라이브러리와 kotlinx.coroutines
라이브러리는 여러 가지 디스패처를 제공합니다.
주요 Dispatchers 종류
- Dispatchers.Default
- Dispatchers.IO
- Dispatchers.Main
- Dispatchers.Unconfined
각 디스패처는 특정한 용도와 최적화된 환경에서 사용됩니다.
Dispatchers.Default
Dispatchers.Default
는 CPU 집약적인 작업을 위한 디스패처입니다. 기본적으로 코어 수에 비례하는 스레드 풀을 사용합니다. 이는 병렬 처리가 필요한 연산에 적합합니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
launch(Dispatchers.Default) {
println("Running on Default: ${Thread.currentThread().name}")
}
}
Dispatchers.IO
Dispatchers.IO
는 IO 작업을 위한 디스패처입니다. 파일 읽기/쓰기, 네트워크 요청 등 블로킹 IO 작업에 최적화되어 있습니다. 이 디스패처는 기본적으로 많은 수의 스레드를 사용하여 블로킹 작업을 처리합니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
launch(Dispatchers.IO) {
println("Running on IO: ${Thread.currentThread().name}")
}
}
Dispatchers.Main
Dispatchers.Main
은 안드로이드와 같은 UI 스레드에서 실행되는 작업을 위한 디스패처입니다. UI 업데이트와 같은 작업에 사용됩니다. 이 디스패처는 안드로이드나 JavaFX와 같은 플랫폼에서만 사용할 수 있습니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
launch(Dispatchers.Main) {
println("Running on Main: ${Thread.currentThread().name}")
}
}
이 예제는 안드로이드 환경에서 실행되어야 합니다.
Dispatchers.Unconfined
Dispatchers.Unconfined
는 특정 스레드에 바인딩되지 않는 디스패처입니다. 처음에는 호출한 스레드에서 실행되지만, 일시 중단 후에는 일시 중단된 함수가 재개되는 스레드에서 실행됩니다. 주로 테스트나 특정한 컨텍스트 전환을 피하고 싶을 때 사용됩니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
launch(Dispatchers.Unconfined) {
println("Running on Unconfined: ${Thread.currentThread().name}")
}
}
Dispatchers 사용 예제
다음은 다양한 디스패처를 사용하는 예제입니다:
import kotlinx.coroutines.*
fun main() = runBlocking {
launch(Dispatchers.Default) {
println("Default: Running on ${Thread.currentThread().name}")
}
launch(Dispatchers.IO) {
println("IO: Running on ${Thread.currentThread().name}")
}
launch(Dispatchers.Unconfined) {
println("Unconfined: Running on ${Thread.currentThread().name}")
delay(100)
println("Unconfined after delay: Running on ${Thread.currentThread().name}")
}
// Dispatchers.Main은 안드로이드 환경에서만 사용 가능
// launch(Dispatchers.Main) {
// println("Main: Running on ${Thread.currentThread().name}")
// }
}
'Kotlin' 카테고리의 다른 글
Launch (0) | 2024.11.27 |
---|---|
Async (0) | 2024.11.27 |
Continuation (0) | 2024.11.27 |
Coroutine - Suspend (1) | 2024.11.20 |
Coroutine VS Thread (0) | 2024.11.20 |