중단이 가능하다는 특징은 코루틴의 근간이 되는 필수적인 요소이다.
이 페이지에서는 코루틴의 중단이 동작하는 원리에 대해 살펴본다.
코루틴에서 중단점이 어떻게 만들어지는지 이해하기 위해 Continuation
객체에 대해 알아야 한다.
Continuation
객체는 코루틴이 중단되었을 때 반환되는 객체이다.
코루틴에서 실행되는 코드 부분과 실행 컨텍스트를 실제로 소유한 객체라는 점에서 코루틴은 연속적으로 이어진 하나 이상의 Continuation
집합이라 볼 수 있다.
추후에 알아볼 launch
와 같은 코루틴 빌더도 내부적으로 이 객체를 생성한다.
Continuation - Kotlin Programming Language
Continuation
은 인터페이스로써 Continuation
실행 환경을 저장하는 CoroutineContext
프로퍼티와 코드 블럭 중 중단된 시점부터 실행을 재개하기 위한 resumeWith()
메소드를 갖는다.
대표적인 중단 함수인 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
를 반환해 중단점으로 동작하게 된다.