저번 시간에는 launch를 사용했었다.
launch와 async
launch와 async는 쓰레드처럼 코루틴을 시작하는 의미이며, 코루틴 빌더라는 것은 전 포스팅에서 확인했다. 즉 코루틴을 생성해주는 것인데, 둘의 차이점이 뭔가?
launch는 Job 객체를 반환하지만 async는 Defferd 객체를 반환한다.
Job은 launch로 생성된 코루틴의 상태를 관리하는 용도로 사용하고 결과값을 리턴받을 수 없으나,
Deferred는 async블럭 내 수행된 결과를 원하는 시점에 return받을 수 있다는 큰 차이가 있습니다.
완료 대기
async 코루틴 블록을 실행하게 되면 Deferred 객체에 대해 await() 함수로 코루틴 블록이 완료될 때까지 대기할 수 있다.
launch 코루틴 블록을 실행하게 되면 Job 객체에 대해 join() 함수로 코루틴 블록이 완료될 때까지 대기할 수 있다.
추가적으로 Deferred, Job 객체가 여러 개이고 그것들이 모두 처리되기를 기다리겠다면 awaitAll(), joinAll()을 사용하면 된다.
fun main() = runBlocking<Unit> {
val time = measureNanoTime {
val one : Deferred<Int> = async { do1() }
val two : Deferred<Int> = async { do2() }
println("${one.await() + two.await()}")
}
}
suspend fun do1() : Int {
delay(1000L)
// 스레드 블록이 아닌 코루틴을 중단하는 suspending function이므로 코루틴에서만 사용 가능능
return 13
}
suspend fun do2() : Int {
delay(1000L)
return 31
}
지연 실행
val job = launch (start = CoroutineStart.LAZY)
val deferred = async (start = CoroutineStart.LAZY)
위 코드와 같이 CoroutineStart.LAZY를 사용하면 해당 코루틴 블록은 지연되어 실행된다.
Job 클래스의 start() 또는 join()이 호출되는 시점에서 luanch 코드 블록이 수행되고,
Deferred 클래스의 start() 함수를 호출하거나 await() 함수를 호출하는 시점에 async 코드 블록이 수행된다.
fun main() = runBlocking<Unit> {
val time = measureNanoTime {
val one : Deferred<Int> = async(start = CoroutineStart.LAZY){
println("one")
do1()
}
val two : Deferred<Int> = async{
println("two")
do2()
}
println("${one.await()}")
println("${two.await()}")
}
}
suspend fun do1() : Int {
delay(1000L)
// 스레드 블록이 아닌 코루틴을 중단하는 suspending function이므로 코루틴에서만 사용 가능능
return 13
}
suspend fun do2() : Int {
delay(1000L)
return 31
}
repeat()를 사용하면 코루틴에서 제공하는 함수로 코루틴 블럭을 반복할 수 있다.
fun main() = runBlocking<Unit> {
repeat(100_000) {
launch {
delay(1000L)
print(".")
}
}
}
'Coroutine' 카테고리의 다른 글
Coroutines - Part. 5 안드로이드에서의 코루틴 - 동기식과 비동기식, 콜백과 코루틴 (0) | 2021.01.30 |
---|---|
Coroutines - Part. 4 안드로이드에서 코루틴 - ViewModel, Activity, Fragment (0) | 2021.01.30 |
Coroutines - Part. 3 withTimeout(), withTimeoutOrNull() (0) | 2021.01.30 |
Coroutines - Part. 2 취소, 취소할 수 없는 블럭 (0) | 2021.01.30 |
Coroutines - Part 1. Coroutine이란 (0) | 2021.01.30 |