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)
        }
    }