1. async
-> 코드를 작성한부분에서 즉시실행되지않고 코루틴을 진행하며 .await()나 .join()으로 결과를 불러옴
async 예시1
CoroutineScope(Dispatchers.Main).launch {
val a = async(Dispatchers.IO) {
delay(3000)
Log.d("ex","a")
}
a.await() //여기에서부터 3초를 기다리고 로그를 표시한다
}
async 예시2
asyncTest가 모두 실행되기까지 약 1초가걸린다
suspend fun asyncTest() {
CoroutineScope(Dispatchers.IO).async {
delay(1000)
}
CoroutineScope(Dispatchers.IO).async {
delay(1000)
}
CoroutineScope(Dispatchers.IO).async {
delay(1000)
}
}
2. withContext
- 인자로 받은 CoroutineContext를 사용해서 코루틴의 실행 쓰레드를 변경한다
- 람다식의 코드를 실행하고 결과를 반환함
- 람다식이 끝나면 이전의 실행 쓰레드환경으로 되돌아온다
CoroutineScope(Dispatchers.Main).launch {
withContext(Dispatchers.IO){ //IO환경으로 전환
delay(3000)
Log.d("ex","b")
}
// MAIN환경으로 되돌아옴
Log.d("ex","끝")
}
3. 차이점
1)async
실행시간 약 1초
suspend fun asyncTest() {
CoroutineScope(Dispatchers.IO).async {
delay(1000)
}
CoroutineScope(Dispatchers.IO).async {
delay(1000)
}
CoroutineScope(Dispatchers.IO).async {
delay(1000)
}
}
2)withContext(병렬처리)
실행시간 약 3초
suspend fun withContextTest() {
withContext(Dispatchers.IO) {
delay(1000)
}
withContext(Dispatchers.IO) {
delay(1000)
}
withContext(Dispatchers.IO) {
delay(1000)
}
}