Suspend (중단)
스레드는 저장이 불가능하고 멈추는 것만 가능하지만, 코루틴은 중단하고 재개가 가능하다
코루틴은 중단 되었을때,
Continuation
객체를 반환한다.suspend 함수(중단 함수) 는 코루틴을 중단할 수 있는 함수이다.
- suspend 함수는 코루틴 또는 다른 suspend 함수에서 호출 되어야한다.
- suspend 함수는 중단할 수 있는 중단점이 필요하다.
|
|
|
|
|
|
Resume (재개)
- 중단된 코루틴은
Continuation
객체를 이용해 재개 가능하다. - 다른 스레드에서 코루틴을 재개할 수 있다.
- 코루틴이 있으면 중단함과 동시에 “데이터를 받고 나면, 받은 데이터를
resume
함수를 통해 보내줘” 라고Continuation
에 전달 - 코루틴에서는 값으로 재개 한다.(
Continuation
의 제네릭 타입 인자)
|
|
|
|
|
|
suspend 와 resume 을 통해, 스레드는 다른 일을 할 수 있고, 값 또는 데이터가 도착하면 스레드는 코루틴이 중단된 지점에서 재개 하게 됩니다.
이때 resume 함수와
Continuation
객체를 통해 값을 얻을 수 있습니다.
|
|
- 스레드를 생성하는 것 보다, ‘알람 시계’를 설정하는계 더 좋다
ScheduledExecutorService
, 정해진 시간이 지나면continuation.resume(Unit)
을 호출하도록 알람 설정
excutor
는delay 함수
를 사용하는 모든 코루틴의 전용 스레드
값으로 재개 하기
|
|
- Unit은 함수의 리턴 타입이며, Continuation의 제네릭 타입 인자이다.
- resume을 통해 반환되는 값은 반드시 지정된 타입과 같은 타입이여야 한다.
|
|
- 코루틴이 있으면 중단함과 동시에 “데이터를 받고 나면, 받은 데이터를
resume
함수를 통해 보내줘” 라고Continuation
에 전달- 그러면 스레드는 다른 일을 할 수 있다.
- 데이터가 도착하면 스레드는 코루틴이 중단된 지점에서 재개 한다.
예외로 재개하기
서비스가 종료되거나 에러로 응답이 오는 경우, 코루틴이 중단된 곳에서 예외를 발생시키고, 이 예외로 재개하는 방법
1 2 3 4 5 6 7 8 9
suspend fun main() { try { suspendCorotine<Unit> { cont -> cont.resumeWithException( MyException() ) } } catch (e: MyException) { println("Caught!") } }
함수가 아닌 코루틴을 중단시킨다
- 중단 함수는 코루틴 자체가 아니다.
- 중단 함수는 함수가 아닌, 코루틴을 중단할 수 있는 함수 이다.
- 다른 스레드나 다른 코루틴으로 재개하지 않으면 프로그램은 실행된 상태로 유지된다
Continuation.kt (code 중 일부)
|
|
Reference
- https://kotlinlang.org/docs/coroutines-guide.html
- 코틀린 코루틴 Kotlin Coroutines: Deep Dive (Marcin Moskała, 인사이트)