suspending method
일시중단함수
yield
다른 코루틴에게 실행을 양보한다. (코틀린 모듈 최상위)
- 예제(yield)
-
suspend fun doSomething111(): Int { log("📗", "doSomething111-----------start") yield() log("📗", "doSomething111-----------end") return 13 } suspend fun doSomething222(): Int { log("📘", "doSomething222-----------start") yield() log("📘", "doSomething222-----------end") return 29 }
-
@Test fun yield_test() { runBlocking { val time = measureTimeMillis { val one = doSomething111() val two = doSomething222() log("📙", "The answer is ${one + two}") } log("📙", "Completed in $time ms") } }
- 예제(delay + yield)
-
@Test fun delay_yield_test() { log("📕", "yieldExample Start") runBlocking { launch { log("📗", "1") yield() log("📗", "3") yield() log("📗", "5") } log("📙", "*****End 1111111*****") launch { log("📘", "2") delay(1000L) log("📘", "4") delay(1000L) log("📘", "6") } log("📙", "*****End 22222222*****") } log("📕", "yieldExample End") }
delay
milisecond 단위로 코루틴을 잠시 대기시킨다. (코틀린 모듈 최상위)
- Thread.sleep은 스레드 자체를 정지시키는데 반해, delay는 코루틴이 멈추지 않고 대기상태에 들어간다.
- 예제
-
suspend fun doSomething111(): Int { log("📗", "doSomething111-----------start") delay(1000L) log("📗", "doSomething111-----------end") return 13 } suspend fun doSomething222(): Int { log("📘", "doSomething222-----------start") delay(1000L) log("📘", "doSomething222-----------end") return 29 }
-
@Test fun delay_test() { runBlocking { val time = measureTimeMillis { val one = doSomething111() val two = doSomething222() log("📙", "The answer is ${one + two}") } log("📙", "Completed in $time ms") } }
join
Job의 실행이 끝날때까지 대기시킨다. (Job 메소드)
- 코루틴 블록이 완료 될때까지 다음 코드 수행을 대기한다.
- 예제
-
fun testJoin() = runBlocking { log("📙", "***** START *****") val job1 = CoroutineScope(Dispatchers.Default).launch { log("📗", "Job one scope start") for (index in 0..5) { log("📗", "Job one scope $index") } log("📗", "Job one scope for end") }.join() val job2 = CoroutineScope(Dispatchers.Default).launch { log("📘", "Job two scope for start") for (index in 0..7) { log("📘", "Job two scope index $index") } log("📘", "Job two scope for end") } log("📙", "***** END *****") }
joinAll
모든 작업이 끝날때까지 현재 작업을 일시중단시킨다.
- 예제
-
fun testJoinAll() = runBlocking { //without cancel log("📙", "***** START *****") val job1 = CoroutineScope(Dispatchers.Default).launch { log("📗", "Job one scope start") for (index in 0..5) { log("📗", "Job one scope $index") } log("📗", "Job one scope for end") }//.join() val job2 = CoroutineScope(Dispatchers.Default).launch { log("📘", "Job two scope for start") for (index in 0..7) { log("📘", "Job two scope index $index") } log("📘", "Job two scope for end") }//.join() joinAll(job1, job2) log("📙", "***** END *****") }
await
Deferred 의 실행이 끝날때까지 대기시키고 결과값을 반환한다.
- 예제
-
fun testAwait() = runBlocking { log("📙", "***** START *****") val job1 = CoroutineScope(Dispatchers.Default).async { log("📗", "Job one scope start") delay(2000) log("📗", "Job one scope end") 11111111 } val job2Value = CoroutineScope(Dispatchers.Default).async { log("📗", "Job two scope start") delay(1000) log("📗", "Job two scope end") 222222222 }.await() log("📙", "await job1Value is ${job1.await()} job2Value is ${job2Value}") log("📙", "***** END *****") }
withTimeout
코루틴 제한시간을 설정하고 그때까지 처리가 끝나지 않았을 경우,
- 블럭을 취소하고 TimeoutCancellationException을 throw한다.
withTimeoutOrNull
withTimeout을 처리 중 제한시간이 경과 되었을 경우,
- 예외 대신 null을 반환한다.
.참고
반응형
'Language > Kotlin' 카테고리의 다른 글
[keyword] Companion Object (0) | 2022.02.17 |
---|---|
[Coroutine] Coroutine builder: 코루틴 시작 (0) | 2022.02.07 |
[Coroutine] Coroutine Context: 코루틴이 실행되는 곳 (0) | 2022.02.06 |
[Coroutine] Coroutine Scope: 코루틴이 실행되는 범위 (0) | 2022.02.05 |
[Coroutine] 코루틴 사용하기 (0) | 2022.02.05 |