💻 프로그래밍

[🔥 Coroutine] #5 또 예제로 복습하기 (async, launch)

콩드로이드 2022. 12. 4. 22:05

✏️ 예제를 통한 복습

suspend fun getRandNum1() : Int {
    delay(1000L)
    return Random.nextInt(0,500)
}

suspend fun getRandNum2() : Int {
    delay(1000L)
    return Random.nextInt(0,500)
}

fun main() = runBlocking {
    val time = measureTimeMills{
    val one = getRandNum1()
    val two = getRandNum2()
    println("${one} + ${two} = ${one + two}")
    }
  println(time)
}

 

순차적으로 실행되어 1000L + 1000L = 2초가 걸림

개별적으로 실행되지만, 순차적으로 실행되어서 항상 getRandNum1이 먼저 실행된다

💡 두 함수가 동시에 실행되면 더 효율적이겠다  -> async

async를 사용하면 두 함수가 각각 별도의 코루틴으로 동작

 

📌 async (CoroutineBuilder) vs launch (CoroutineBuilder)

async : 결과값을 반환(await를 사용)

launch : 결과를 반환하지 않아도 될 때 (job의 join, cancel 같은 일)

 

suspend fun getRandNum1() : Int {
    delay(1000L)
    return Random.nextInt(0,500)
}

suspend fun getRandNum2() : Int {
    delay(1000L)
    return Random.nextInt(0,500)
}

fun main() = runBlocking {
    val time = measureTimeMills{
    val one = async {
        getRandNum1()
    }
    val two = asynch {
        getRandNum2()
    }
    println("${one.await()} + ${two.await()} = ${one.await() + two.await()}")
    }
  println(time)
}

1000L ,1000L이 같이 수행되므로 1초가 걸림 

await() = job의 join과 비슷 + 결과반환 

async와 await는 항상 짝을 이루고, await는 중단점이 된다 

 

async를 사용하는 순간 코드블록이 수행을 준비하는데, 만약 수행을 좀 늦추고 싶다면
async(start = CoroutineStart.LAZY)를 선언하고 .start()를 선언하면 큐에 수행을 예약한다

 


아직 개념잡기에 여념이 없습니다😂 패스트 캠퍼스 강의 강추합니다,, 선생님 만세 

다음은 Dispatcher로 돌아오겠습니다 :)