개요

중단이 가능하다는 특징은 코루틴의 근간이 되는 필수적인 요소이다.

이 페이지에서는 코루틴의 중단이 동작하는 원리에 대해 살펴본다.

Continuation

코루틴에서 중단점이 어떻게 만들어지는지 이해하기 위해 Continuation 객체에 대해 알아야 한다.

Continuation 객체는 코루틴이 중단되었을 때 반환되는 객체이다.

코루틴에서 실행되는 코드 부분과 실행 컨텍스트를 실제로 소유한 객체라는 점에서 코루틴은 연속적으로 이어진 하나 이상의 Continuation 집합이라 볼 수 있다.

추후에 알아볼 launch와 같은 코루틴 빌더도 내부적으로 이 객체를 생성한다.

Continuation - Kotlin Programming Language

Continuation은 인터페이스로써 Continuation 실행 환경을 저장하는 CoroutineContext프로퍼티와 코드 블럭 중 중단된 시점부터 실행을 재개하기 위한 resumeWith() 메소드를 갖는다.

delay 함수

대표적인 중단 함수인 delay를 하나의 예로 보면 아래와 같이 Continuation을 사용함을 알 수 있다.

suspend fun delay(ms: Long) = suspendCoroutine { continuation ->
    Timer().schedule(object : TimerTask() {
        override fun run() {
            continuation.resume(Unit)
        }
    }, ms)
}

suspendCoroutine메소드는 중단 함수에서 Continuation 객체를 주입받아 이를 직접 제어할 수 있는 콜백을 생성하는 함수이다. 만약 suspendCoroutine 내부에서 resumeWith 메소드를 명시적으로 호출하지 않으면 이를 호출한 중단 함수는 COROUTINE_SUSPEND를 반환하도록 구현되어 있다.

delay 메소드에서는 Timer에 의해 스케쥴링된 별도의 스레드에서 Continuation.resumeWith()가 실행된다. 따라서 COROUTINE_SUSPEND를 반환해 중단점으로 동작하게 된다.