개발일지

Kotlin in A..Z - Coroutine(2) 기본 본문

Kotlin (코틀린)

Kotlin in A..Z - Coroutine(2) 기본

강태종 2020. 10. 15. 15:47

코루틴 빌더

runBlocking { }

-> 해당 코루틴이 끝날 때 까지 Blocking한다.

fun main() {
    // delay(1000L)가 실행되는 동안 main함수가 끝나고 println을 만나지 못하고 종료

    GlobalScope.launch {
        delay(1000L)
        println("Pass")
    }
}
Process finished with exit code 0

 

fun main() {
    GlobalScope.launch {
        delay(1000L)
        println("Pass")
    }

    runBlocking {
        // delay(2000L)이 끝날 때 까지 Blocking 된다.
        delay(2000L)
    }
}
Pass

Process finished with exit code 0

 

launch { }

-> runBlocking과 다르게 Blocking되지 않는다. (GlobalScope는 어플리케이션 수명동안 작동한다. 가급적 사용을 피할 것)

fun main() {
    CoroutineScope(Dispatchers.Default).launch {
        delay(1000L)
        println("PASS")
    }

    Thread.sleep(2000L)
}
PASS

Process finished with exit code 0

suspend

suspend함수는 suspend함수 또는 Coroutine Scope에서만 실행가능하다 -> suspend함수는 suspend함수를 호출할 수 있다.

fun main() {
    println("Main Start")
    // Error : uspend function 'delay' should be called only from a coroutine or another suspend function
    delay(1000L)
}
suspend fun mySuspend() {
    println("Run")
}

fun main() {
    println("Main Start")
    // Error : Suspend function 'mySuspend' should be called only from a coroutine or another suspend functio
    mySuspend()
}
suspend fun mySuspend() {
    // suspend 함수는 다른 suspend함수를 호출할 수 있다.
    delay(1000L)
    println("Run")
}

fun main() = runBlocking {
    // 코루틴 스코프에서 suspend함수를 호출할 수 있다.
    mySuspend()
}
Run

Process finished with exit code 0

join

-> Job이 끝날 때까지 기다리는 것 (Thread의 join과 비슷)

fun main() = runBlocking {
    val job = GlobalScope.launch {
        println("Job is running")
        delay(1000L)
        println("Job is finished")
    }

//    join이 없으면, job이 완료되기 전에 main함수가 종료되면서 프로그램 종료
    job.join()
}
Job is running

Process finished with exit code 0

Coroutine vs Thread

Coroutine은 Thread에 비해 속도, 메모리가 훨씬 효율적이다.

 

coroutine

fun main() = runBlocking {
    repeat(100_000) {
        launch {
            delay(1000L)
            if (it % 10 == 0) {
                println(".")
            } else {
                print(".")
            }
        }
    }
}

=> 비교적 빠르게 끝남

 

thread

fun main() = runBlocking {
    repeat(100_000) {
        thread {
            Thread.sleep(1000L)
            if (it % 10 == 0) {
                println(".")
            } else {
                print(".")
            }
        }
    }
}

=> 비교적 느리게 끝남

'Kotlin (코틀린)' 카테고리의 다른 글

Kotlin in A..Z - Coroutine(4) async  (0) 2020.10.27
Kotlin in A..Z - Coroutine(3) Cancel  (0) 2020.10.15
Kotlin in A..Z - Coroutine(1) 개념  (0) 2020.10.08
Kotlin in A..Z - 범위 지정 함수  (0) 2020.07.27
Kotlin in A..Z - Array  (0) 2020.07.21
Comments