Coroutine 탐험일지(0)

이창민·2022년 7월 5일
0

Coroutines

목록 보기
1/2

Android를 개발하다 보면 Coroutine을 사용하게 됩니다.
왜 Thread를 안 쓰고 코루틴으로 동시성을 보장하지? 라는 생각이 들었습니다.
이를 알아보기 위해 우선 Thread와 Coroutine의 차이를 알아보려 합니다.

탐험일지..

Thread

Thread의 Task 단위는 Thread 입니다.
즉, 할 일들을 Thread마다 할당합니다. 각 Thread는 JVM의 Stack 영역에 자체 메모리 영역을 가집니다.
그러다 보니 OS에 의한 Context Swithing을 통해 여러 작업이 동시에 이뤄집니다.
Thread A가 B의 작업 결과를 기다려야 한다면 A는 Blocking되어 해당 Thread를 사용하지 못합니다.

Coroutine

Coroutine의 Task 단위는 Object 입니다.
즉, 할 일들을 Object마다 할당합니다. 각 코루틴 object는 객체를 담는 JVM의 Heap 영역을 차지합니다.
그러다 보니 개발자의 코딩에 의한 Swithing을 통해 여러 작업이 동시에 이뤄집니다.
Task 1이 Task 2의 결과를 기다려야 한다면 Task 1은 Suspend 됩니다.
여기서 Thread와 다르게 Block 되는 것이 아닌, Task 1을 수행하던 Thread는 다른 Task를 수행할 수 있습니다. 즉, 만약 Task1과 Task2가 같은 Thread에 할당되었다면 Task1을 수행 중 스위칭하고 Task2를 끝내고 다시 Task1을 같은 Thread에서 수행할 수 있습니다.

Thread vs Coroutine 실행 시간 실험

fun runWithThread() = runBlocking {
    println("시작전 활성화 Thread count = ${Thread.activeCount()}")
    val time = measureTimeMillis {
        val jobs = ArrayList<Thread>()
        repeat(100000) {
            jobs += Thread {
                Thread.sleep(1000L)
            }.also { it.start() }
        }
        println("끝 활성화 Thread count = ${Thread.activeCount()}")
        jobs.forEach { it.join() }
    }
    println("걸린 시간 = $time")
}

fun runWithCoroutine() = runBlocking {
    println("시작전 활성화 Thread count = ${Thread.activeCount()}")
    val time = measureTimeMillis {
        val jobs = ArrayList<Job>()
        repeat(100000){
            jobs +=launch(Dispatchers.Default){
                delay(1000L)
            }
        }
        println("끝 활성화 Thread count = ${Thread.activeCount()}")
        jobs.forEach { it.join() }
    }
    println("걸린 시간 = $time")
}

시작전 활성화 Thread count = 2
끝 활성화 Thread count = 5402
걸린 시간 = 27138
시작전 활성화 Thread count = 2
끝 활성화 Thread count = 11
걸린 시간 = 1595

Coroutine을 사용할 때, Thread count가 적게 들고, 걸린 시간이 적은 것을 확인할 수 있습니다.
스레드를 확인하고 싶다면 아래와 같이 코드를 변경해도 됩니다.

jobs += Thread {
    Thread.sleep(1000L)
    println("${Thread.currentThread().name}")
}.also { it.start() }

위 같은 코드를 입력하면 Thread가 계속 바뀌는 것을 볼 수 있습니다.
코루틴의 경우 DefaultDispatcher-worker가 계속 바뀌는 것을 볼 수 있습니다.
간단한 실험을 통해 코루틴을 사용하는 것이 더 이득인 것을 알 수 있습니다.

profile
android 를 공부해보아요

0개의 댓글