📌 Kotlin Coroutines에서 cancelAndJoin
사용하기
1. 개요
Kotlin의 cancelAndJoin
함수는 실행 중인 코루틴을 취소하고, 해당 코루틴이 완전히 종료될 때까지 기다리는 역할을 합니다.
이는 cancel()
과 join()
을 연속적으로 호출하는 것과 동일한 효과를 가지며, 코루틴의 종료를 보다 간결하게 처리할 수 있도록 도와줍니다.
2. 기본 사용법
다음은 cancelAndJoin
을 활용하는 기본적인 예제입니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
repeat(5) { i ->
println("작업 실행 중... ($i)")
delay(500L)
}
}
delay(1000L) // 일정 시간 후 작업 취소
job.cancelAndJoin()
println("코루틴이 취소되고 완전히 종료됨")
}
위 코드에서는 코루틴이 실행되다가 job.cancelAndJoin()
이 호출되면서 즉시 취소되고, 해당 코루틴이 종료될 때까지 기다립니다.
3. 취소 예외 처리
코루틴이 취소되면 기본적으로 CancellationException
이 발생합니다. 이를 안전하게 처리하려면 try-finally
블록을 활용할 수 있습니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
try {
repeat(5) { i ->
println("실행 중... ($i)")
delay(500L)
}
} finally {
println("코루틴이 취소됨 - 정리 작업 수행")
}
}
delay(1000L)
job.cancelAndJoin()
println("코루틴 종료 완료")
}
위 코드에서는 finally
블록을 활용하여, 코루틴이 취소될 때 정리 작업을 수행할 수 있도록 하였습니다.
4. 부모-자식 코루틴 관계에서의 cancelAndJoin
부모 코루틴이 자식 코루틴을 cancelAndJoin()
을 호출하여 종료하면, 자식 코루틴이 실패할 경우 기본적으로 부모 코루틴도 취소됩니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
val parentJob = launch {
val childJob = launch {
delay(500L)
throw Exception("자식 코루틴에서 예외 발생!")
}
try {
childJob.cancelAndJoin()
} catch (e: Exception) {
println("예외 처리: ${e.message}")
}
}
parentJob.join()
println("부모 코루틴 종료")
}
위 코드에서 childJob
이 예외를 발생시키면, parentJob
도 영향을 받아 취소됩니다.
📌 원본 출처
본 문서의 예제와 내용은 Kotlin 공식 문서를 참고하여 작성되었습니다. 자세한 내용은 아래 공식 문서를 통해 확인할 수 있습니다.
'Kotlin > kotlinx.coroutines' 카테고리의 다른 글
CancellableContinuation (0) | 2025.02.07 |
---|---|
cancelChildren (0) | 2025.02.07 |
cancel (0) | 2025.02.07 |
awaitCanellation (0) | 2025.02.07 |
awaitAll (0) | 2025.02.07 |