runBlocking

2024. 11. 27. 15:56Kotlin

코틀린(Kotlin)에서 runBlocking은 코루틴을 시작하고, 해당 코루틴이 완료될 때까지 현재 스레드를 차단하는 함수입니다. 이는 주로 메인 함수나 테스트 코드에서 사용되며, 코루틴의 실행을 동기적으로 기다려야 할 때 유용합니다. runBlocking은 코루틴 빌더 중 하나로, 블로킹 방식으로 코루틴을 실행합니다.

runBlocking의 기본 사용법

runBlocking을 사용하여 코루틴을 시작하고, 해당 코루틴이 완료될 때까지 현재 스레드를 차단할 수 있습니다. 다음은 runBlocking의 기본 예제입니다:

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        delay(1000L)
        println("Hello from Coroutine!")
    }
    println("Hello from Main!")
}

위 예제에서 runBlocking 블록 내에서 launch를 사용하여 코루틴을 시작합니다. delay(1000L)로 인해 1초 동안 일시 중단된 후 "Hello from Coroutine!" 메시지가 출력됩니다. runBlocking은 코루틴이 완료될 때까지 현재 스레드를 차단하므로, "Hello from Main!" 메시지가 먼저 출력되고 나서 코루틴의 메시지가 출력됩니다.

runBlocking과 CoroutineScope

runBlockingCoroutineScope를 생성하며, 이 스코프 내에서 코루틴을 시작할 수 있습니다. runBlocking 블록 내에서 여러 개의 코루틴을 시작할 수 있습니다:

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        delay(1000L)
        println("Coroutine 1")
    }

    launch {
        delay(500L)
        println("Coroutine 2")
    }

    println("Hello from Main!")
}

위 예제에서 두 개의 코루틴이 runBlocking 블록 내에서 시작됩니다. 각 코루틴은 서로 다른 지연 시간을 가지며, "Hello from Main!" 메시지가 먼저 출력된 후 코루틴의 메시지가 출력됩니다.

runBlocking과 Dispatchers

runBlocking은 기본적으로 호출된 스레드에서 실행되지만, Dispatchers를 사용하여 다른 스레드에서 실행될 수 있습니다. 다음은 Dispatchers를 사용하는 예제입니다:

import kotlinx.coroutines.*

fun main() = runBlocking(Dispatchers.Default) {
    launch {
        println("Running on Default: ${Thread.currentThread().name}")
    }

    launch(Dispatchers.IO) {
        println("Running on IO: ${Thread.currentThread().name}")
    }
}

위 예제에서 runBlockingDispatchers.Default에서 실행되며, 두 개의 코루틴이 각각 Dispatchers.DefaultDispatchers.IO에서 실행됩니다.

runBlocking과 예외 처리

runBlocking 블록 내에서 발생한 예외는 호출한 스레드로 전파됩니다. 예외 처리를 위해 try-catch 블록을 사용할 수 있습니다:

import kotlinx.coroutines.*

fun main() = runBlocking {
    try {
        launch {
            throw Exception("Something went wrong")
        }.join()
    } catch (e: Exception) {
        println("Caught exception: ${e.message}")
    }
}

위 예제에서 launch 블록 내에서 예외가 발생하면, try-catch 블록을 통해 예외를 처리할 수 있습니다.

runBlocking과 구조적 동시성

코루틴은 구조적 동시성을 지원하며, 이는 부모 코루틴이 완료될 때 자식 코루틴도 함께 취소됨을 의미합니다. runBlocking도 이 원칙을 따릅니다:

import kotlinx.coroutines.*

fun main() = runBlocking {
    val parentJob = launch {
        val childJob = launch {
            delay(1000L)
            println("Hello from Child Coroutine!")
        }
        delay(500L)
        println("Hello from Parent Coroutine!")
    }
    delay(300L)
    parentJob.cancel()  // Cancels the parent job and its children
}

위 예제에서 parentJob.cancel()을 호출하면 부모 코루틴과 그 안의 자식 코루틴이 모두 취소됩니다.

runBlocking의 주의사항

runBlocking은 주로 메인 함수나 테스트 코드에서 사용되며, 일반적인 애플리케이션 코드에서는 자주 사용되지 않습니다. 이는 runBlocking이 현재 스레드를 차단하기 때문에, UI 스레드를 차단하는 등의 부작용을 초래할 수 있기 때문입니다. 따라서, runBlocking은 주로 동기적으로 코루틴을 실행해야 하는 상황에서만 사용해야 합니다.

'Kotlin' 카테고리의 다른 글

withContext  (0) 2024.11.27
Yield  (0) 2024.11.27
Launch  (0) 2024.11.27
Async  (0) 2024.11.27
Dispatchers  (0) 2024.11.27