시배's Android

Kotlin Coroutines Deep Dive | 3장. 중단은 어떻게 작동할까? 본문

Book/Kotlin Coroutines Deep Dive

Kotlin Coroutines Deep Dive | 3장. 중단은 어떻게 작동할까?

si8ae 2024. 1. 18. 21:14

중단

  • 코루틴은 중단되었을 때 Continuation 객체를 반환합니다.
  • Continuation을 이용하면 멈췄던 곳에서 다시 코루틴을 실행할 수 있습니다.
  • 스레드는 저장이 불가능하고 멈추는 것만 가능합니다.
  • 코루틴은 다른 스레드에서 시작할 수 있고, 컨티뉴에이션 객체는 (이론상) 직렬화와 역직렬화가 가능하며 다시 실행될 수 있습니다.

재개

  • 중단 함수는 말 그대로 코루틴을 중단할 수 있는 함수입니다. 이는 중단 함수가 반드시 코루틴(또는 다른 중단 함수)에 의해 호출되어야 함을 의미합니다.
  • ScheduledExecutorService를 통해 특정 시간 이후에 중단을 멈추고 재개할 수 있도록 할 수 있습니다.
private val executor = 
	Executors.newSingleThreadScheduledExecutor {
    	Thread(it, "scheduler").apply { isDaemon = true }
    }
    
suspend fun main() {
	println("Before")
    
    suspendCoroutine<Unit> { continuation ->
    	executor.schedule({
        	continuation.resume(Unit)
        }, 1000, TimeUnit.MILLISECONDS)
    }
    
    println("After")
}
  • delay가 구현된 방식이랑 정확히 일치합니다.
  • suspendCoroutine을 호출할 때 컨티뉴에이션 객체로 반환될 값의 타입을 지정할 수 있습니다.
  • resume을 통해 반환되는 값은 반드시 지정된 타입과 같은 타입이어야 합니다.
  • 코루틴이 있으면 중단함과 동시에 데이터를 받고 나면, 받은 데이터를 resume 함수를 통해 보내줘라고 컨티뉴에이션 객체를 통해 라이브러리에 전달할 수 있습니다.