중단하거나 재개할 수 있는 함수
import kotlin.random.Random
import kotlin.system.*
import kotlinx.coroutines.*
suspend fun getRandom1(): Int {
delay(1000L)
return Random.nextInt(0, 500)
}
suspend fun getRandom2(): Int {
delay(1000L)
return Random.nextInt(0, 500)
}
fun main() = runBlocking {
val elapsedTime = measureTimeMillis {
val value1 = getRandom1()
val value2 = getRandom2()
println("${value1} + ${value2} = ${value1 + value2}")
}
println(elapsedTime)
}
결과: 348 + 83 = 431 랜덤이라서 실행할때마다 결과가 다름
실행시간: 2015
메인함수를 보면 value1 다음에 value2가 순차적으로 실행되게 되는데 여기서 동시에 실행하면 성능을 훨씬 높일 수 있는 방법이 있다.
import kotlin.random.Random
import kotlin.system.*
import kotlinx.coroutines.*
suspend fun getRandom1(): Int {
delay(1000L)
return Random.nextInt(0, 500)
}
suspend fun getRandom2(): Int {
delay(1000L)
return Random.nextInt(0, 500)
}
fun main() = runBlocking {
val elapsedTime = measureTimeMillis {
val value1 = async { getRandom1() }
val value2 = async { getRandom2() }
println("${value1.await()} + ${value2.await()} = ${value1.await() + value2.await()}") // await이 서스펜션가 된다.
}
println(elapsedTime)
}
결과: 57 + 429 = 486
실행시간: 1028
순차적으로 실행할 때보다 시간이 확실히 많이 줄어든 것을 확인 할 수 있다.
실행 목적을 생각했을 때 async는 결과 값을 받아야하는 경우, launch는 결과값을 받지 않아도 되는 경우(response 받은 후 liveData 값 변경)라고 생각하면 된다.