📌 Kotlin Coroutines의 CoroutineDispatcher
이해하기
1. 개요
CoroutineDispatcher
는 코루틴의 실행을 제어하는 추상 클래스입니다. 코루틴 디스패처는 코루틴이 어떤 스레드나 스레드 풀에서 실행될지를 결정합니다. 다양한 디스패처를 사용하여 코루틴의 실행 컨텍스트를 지정할 수 있습니다.
2. 주요 디스패처 종류
- Dispatchers.Default: 기본 디스패처로, CPU 집약적인 작업에 적합합니다. 공유된 백그라운드 스레드 풀을 사용합니다.
- Dispatchers.IO: I/O 작업에 최적화된 디스패처로, 파일 또는 네트워크 I/O와 같은 차단 작업을 처리하는 데 사용됩니다. 필요에 따라 스레드를 생성하는 공유 풀을 사용합니다.
- Dispatchers.Main: UI 스레드에서 코루틴을 실행하는 디스패처로, 안드로이드와 같은 UI 애플리케이션에서 주로 사용됩니다.
- Dispatchers.Unconfined: 특정 스레드에 제한되지 않는 디스패처로, 코루틴을 현재 호출 프레임에서 시작하고 첫 번째 중단 지점까지 실행합니다. 일반적으로 권장되지 않습니다.
3. 디스패치 절차
코루틴의 디스패치 절차는 일반적으로 다음과 같이 수행됩니다:
isDispatchNeeded
함수를 호출하여 코루틴을 디스패치해야 하는지 여부를 결정합니다.- 만약
isDispatchNeeded
가true
를 반환하면,dispatch
함수를 사용하여 코루틴을 디스패치합니다. 디스패처가 작업을 시작하는 데 시간이 걸릴 수 있지만,dispatch
함수 자체는 작업이 시작되기 전에 즉시 반환될 수 있습니다. - 디스패치가 필요하지 않은 경우(예: 이미 메인 스레드에 있는
Dispatchers.Main.immediate
또는Dispatchers.Unconfined
),dispatch
함수는 호출되지 않으며, 코루틴은 디스패치 절차를 수행하는 스레드에서 재개됩니다.
4. 주요 함수
- dispatch: 주어진 코루틴 컨텍스트와 함께 실행할
Runnable
블록을 요청합니다. 디스패처는 이 블록이 결국 실행되도록 보장합니다. - isDispatchNeeded: 주어진 코루틴 컨텍스트에서 디스패치가 필요한지 여부를 반환합니다. 대부분의 디스패처에서 기본적으로
true
를 반환합니다. - limitedParallelism: 현재 디스패처의 병렬 처리 수준을 제한하는 뷰를 생성합니다. 이를 통해 새로운 스레드를 생성하지 않고도 개인 스레드 풀을 만들 수 있습니다.
- asExecutor:
CoroutineDispatcher
인스턴스를Executor
구현으로 변환합니다.
5. 사용 예시
다음은 다양한 디스패처를 사용하는 코루틴의 예시입니다:
import kotlinx.coroutines.*
fun main() = runBlocking {
// Default 디스패처를 사용하는 코루틴
launch(Dispatchers.Default) {
println("Default 디스패처에서 실행 - 스레드: ${Thread.currentThread().name}")
}
// IO 디스패처를 사용하는 코루틴
launch(Dispatchers.IO) {
println("IO 디스패처에서 실행 - 스레드: ${Thread.currentThread().name}")
}
// Main 디스패처를 사용하는 코루틴 (주의: JVM에서는 별도의 설정이 필요할 수 있음)
launch(Dispatchers.Main) {
println("Main 디스패처에서 실행 - 스레드: ${Thread.currentThread().name}")
}
// Unconfined 디스패처를 사용하는 코루틴
launch(Dispatchers.Unconfined) {
println("Unconfined 디스패처에서 실행 - 스레드: ${Thread.currentThread().name}")
}
}
위의 예시에서, 각 코루틴은 지정된 디스패처에 따라 다른 스레드에서 실행됩니다. Dispatchers.Main
을 사용할 때는 JVM 환경에서 별도의 설정이 필요할 수 있습니다.
📌 원본 출처
본 문서의 내용은 Kotlin 공식 문서를 참고하여 작성되었습니다. 자세한 내용은 아래 공식 문서를 통해 확인할 수 있습니다.
'Kotlin > kotlinx.coroutines' 카테고리의 다른 글
CopyableThrowable (0) | 2025.02.07 |
---|---|
CopyableThreadContextElement (0) | 2025.02.07 |
CompletionHandler (0) | 2025.02.07 |
completeWith (0) | 2025.02.07 |
CompletableJob (0) | 2025.02.07 |