Dispatchers

2024. 11. 27. 13:49Kotlin

코틀린(Kotlin)에서 코루틴(Coroutines)은 여러 가지 컨텍스트에서 실행될 수 있으며, 이를 관리하기 위해 Dispatchers가 사용됩니다. Dispatchers는 코루틴이 어떤 스레드 또는 스레드 풀에서 실행될지를 결정합니다. 코틀린 표준 라이브러리와 kotlinx.coroutines 라이브러리는 여러 가지 디스패처를 제공합니다.

주요 Dispatchers 종류

  1. Dispatchers.Default
  2. Dispatchers.IO
  3. Dispatchers.Main
  4. 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