privatevalexecutor=Executors.newSingleThreadScheduledExecutor{Thread(it,"scheduler").apply{isDaemon=true}}suspendfundelay(timeMillis:Long):Unit=suspendCoroutine{cont->executor.schedule({cont.resume(Unit)},timeMillis,TimeUnit.MILLISECONDS)}suspendfunmain(){println("Before")delay(1000)println("After")}// Before
// (1 second delay)
// After
위와같이 suspendCancellableCoroutine으로 성공시와 실패시 로직을 다르게 구현할 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Do not do this
varcontinuation:Continuation<Unit>?=nullsuspendfunsuspendAndSetContinuation(){suspendCoroutine<Unit>{cont->continuation=cont}}suspendfunmain(){println("Before")suspendAndSetContinuation()continuation?.resume(Unit)println("After")}// Before
suspend은 함수를 중지하는것이 아닌, coroutine을 중지하는 것임
suspendAndSetContinuation에서 suspend후 바로 다음 라인(14번) continuation?.resume(Unit)이 실행되어 실행이 재개될 것 처럼 보이지만 재개되지 않음