- 코루틴의 취소는 협조적이다: 코루틴은 취소 요청을 받았을 때 즉시 종료되는 것이 아니라, 자신이 취소 가능 상태인지 확인하고
CancellationException
을 던져 종료된다. 이는 협조적 취소(cooperative cancellation)라고 불린다.
- withContext 블록:
withContext
블록 내에서도 CancellationException
이 발생하면 해당 블록이 취소된다. 이는 withContext
블록이 코루틴 컨텍스트를 변경하여 실행하는 구조이기 때문이다.
suspend fun main() {
val job = Job()
val scope = CoroutineScope(Dispatchers.Default + job)
scope.launch {
withContext(Dispatchers.IO) {
try {
delay(Long.MAX_VALUE)
} catch (e: CancellationException) {
println("Cancelled")
}
}
}
delay(1000L)
job.cancel() // withContext 블록 내 코루틴도 취소됨
}
- 취소된 코루틴에서의 자원 해제: 코루틴이 취소될 때, 필요한 자원 해제를 위해
finally
블록을 사용할 수 있다. 이 블록 내에서 자원을 정리하고 종료할 수 있다.
val job = launch {
try {
// 코루틴 작업
} finally {
// 자원 해제
}
}
job.cancel()
- ensureActive(): 코루틴 내부에서 현재 코루틴이 활성화 상태인지 확인하고, 활성화되지 않았으면
CancellationException
을 던지는 함수.
val job = launch(Dispatchers.Default) {
while (isActive) {
// 코루틴 작업
ensureActive() // 활성화 상태 확인
}
}