본문 바로가기

Kotlin/kotlinx.coroutines

CoroutineDispatcher

📌 Kotlin Coroutines의 CoroutineDispatcher 이해하기

1. 개요

CoroutineDispatcher는 코루틴의 실행을 제어하는 추상 클래스입니다. 코루틴 디스패처는 코루틴이 어떤 스레드나 스레드 풀에서 실행될지를 결정합니다. 다양한 디스패처를 사용하여 코루틴의 실행 컨텍스트를 지정할 수 있습니다.

2. 주요 디스패처 종류

  • Dispatchers.Default: 기본 디스패처로, CPU 집약적인 작업에 적합합니다. 공유된 백그라운드 스레드 풀을 사용합니다.
  • Dispatchers.IO: I/O 작업에 최적화된 디스패처로, 파일 또는 네트워크 I/O와 같은 차단 작업을 처리하는 데 사용됩니다. 필요에 따라 스레드를 생성하는 공유 풀을 사용합니다.
  • Dispatchers.Main: UI 스레드에서 코루틴을 실행하는 디스패처로, 안드로이드와 같은 UI 애플리케이션에서 주로 사용됩니다.
  • Dispatchers.Unconfined: 특정 스레드에 제한되지 않는 디스패처로, 코루틴을 현재 호출 프레임에서 시작하고 첫 번째 중단 지점까지 실행합니다. 일반적으로 권장되지 않습니다.

3. 디스패치 절차

코루틴의 디스패치 절차는 일반적으로 다음과 같이 수행됩니다:

  1. isDispatchNeeded 함수를 호출하여 코루틴을 디스패치해야 하는지 여부를 결정합니다.
  2. 만약 isDispatchNeededtrue를 반환하면, dispatch 함수를 사용하여 코루틴을 디스패치합니다. 디스패처가 작업을 시작하는 데 시간이 걸릴 수 있지만, dispatch 함수 자체는 작업이 시작되기 전에 즉시 반환될 수 있습니다.
  3. 디스패치가 필요하지 않은 경우(예: 이미 메인 스레드에 있는 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 Coroutines 공식 문서 - CoroutineDispatcher

'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