2024. 11. 27. 15:56ㆍKotlin
코틀린(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
runBlocking
은 CoroutineScope
를 생성하며, 이 스코프 내에서 코루틴을 시작할 수 있습니다. 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}")
}
}
위 예제에서 runBlocking
은 Dispatchers.Default
에서 실행되며, 두 개의 코루틴이 각각 Dispatchers.Default
와 Dispatchers.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 |