본문 바로가기

Kotlin/kotlinx.coroutines

cancelAndJoin

📌 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 Coroutines 공식 문서 - cancelAndJoin

'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