기본적인 취소

suspend fun main(): Unit = coroutineScope {
    val job = launch {
        repeat(1_000) { i ->
            delay(200)
            println("Printing $i")
        }
    }
    delay(1100)
    job.cancel()
    job.join()
    println("Cancelled success")
}

실행결과
Printing 0
Printing 1
Printing 2
Printing 3
Printing 4
Cancelled success

취소는 어떻게 작동하는가?

suspend fun main(): Unit = coroutineScope {
    val job = Job()
    launch(job) {
        try {
            repeat(1_000) { i ->
                delay(200)
                println("Printing $i")
            }
        } catch (e: CancellationException) {
            println(e)
            throw e
        }
    }
    delay(1100)
    job.cancelAndJoin()
    println("Cancelled success")
}

실행결과
Printing 0
Printing 1
Printing 2
Printing 3
Printing 4
kotlinx.coroutines.JobCancellationException: Job was cancelled; job=JobImpl{Cancelling}@53908b12
Cancelled success

취소 중 코루틴을 한 번 더 호출하기

suspend fun main(): Unit = coroutineScope {
    val job = Job()
    launch(job) {
        try {
            repeat(1_000) { i ->
                delay(200)
                println("Printing $i")
            }
        } finally {
            println("Finally")
            launch {  // 무시됨
                println("Will not be printed")
            }
            delay(1000) // 예외 발생
            println("Will not printed")
        }
    }
    delay(1100)
    job.cancelAndJoin()
    println("Cancelled success")
}

실행결과
Printing 0
Printing 1
Printing 2
Printing 3
Printing 4
Finally
Cancelled success