💻 프로그래밍

[🔥 Coroutine] #2 runBlocking , async

콩드로이드 2022. 11. 5. 20:28

안녕하세요 아주 오랜만입니다

약간의 휴식기를 갖고 왔습니다 :) 


CoroutineBuilder에 관해선, 이전 포스팅에도 있기 때문에, 간단한 예제를 통해 복습하겠습니다 

간단한 예제지만, 코루틴을 처음 접하기 때문에 쉬운 예제부터 시작해 천천히 개념을 명확히 알아보려합니다 🙇🏻‍♀️

2022.08.30 - [💻 프로그래밍] - [🔥Coroutine] # 1 Coroutine을 배워봅시다

 

 

1. runBlocking

runBlocking 내의 코드가 완료되기 전까지 mainThread를 종료시키지 않음 -> 동시성이 깨짐

다른 코루틴의 Thread를 중지할 수도 있기 때문에 주로 테스트코드 작성시에 많이 쓰임

테스트 코드를 살펴보겠습니다 

@Test
fun testRunBlock() = runBlocking {
	val time = measureTimeMillis {
    	val name = getName()
        val lucky = getLuckyNum()
        
        println("$name's Lucky Number : $lucky")
    }
    
    println("Running Time: $time")
    
}

suspend fun getName() : String { 
	delay(2000)
	return "아이브"
}

suspend fun getLuckyNum() : Int {
	delay(3000)
        return Random().nextInt(100)
}

 

몇초가 소요될 것 같나요 ? 🔍

🔑 코드가 완료되기 전까지 mainThread를 종료하지 않음에 포인트를 둬야합니다 

그러므로 위 예제 실행완료까지는 약 5초의 시간이 걸립니다 😞

이름을 얻고 (2초)  ➡️ 행운의 숫자를 얻고 (3초)

 

 

2. async

Deferred<T> 형태로 결과를 반환하는 CoroutineBuilder

await로 처리해서 값 반환까지 대기 가능 

    @Test
    fun testAsync() = runBlocking {

        val time = measureTimeMillis {
            val name = async { getName() }
            val num = async { getNumber() }
            println("Hi, ${name.await()} ${num.await()}")
        }
        println("time: $time")
    }

    suspend fun getName(): String {
        delay(3000)
        return "아이브"
    }

    suspend fun getNumber(): Int {
        delay(2000)
        return Random().nextInt(100)
    }

 

 

이름을 얻고 행운의 숫자를 가져오는 과정이 🔑 병렬로 진행되기에, 3초가 소요됩니다

 


패스트캠퍼스 강의를 참고했어요 :)