본문으로 바로가기

스코프 빌더, 잡 #2

category Book & Lecture/FastCampus 2022. 4. 15. 20:37

스코프 빌더, 잡 #2

목차

    suspend 함수에서 코루틴 빌더 호출

    import kotlinx.coroutines.*
    
    suspend fun doOneTwoThree() {
        launch {
            println("launch1: ${Thread.currentThread().name}")
            delay(1000L)
            println("3!")
        }
    
        launch {
            println("launch2: ${Thread.currentThread().name}")
            println("1!")
        }
    
        launch {
            println("launch3: ${Thread.currentThread().name}")
            delay(500L)
            println("2!")  
        }
        println("4!")
    }
    
    fun main() = runBlocking {
        doOneTwoThree()
        println("runBlocking: ${Thread.currentThread().name}")
        println("5!")
    }

    해당 코드는 오류가 발생.

    runBlocking을 제외한 코루틴 빌더는 코루틴 스코프 내에서 호출 되어야 함.

    코루틴 스코프

    코루틴 스코프 만드는 다른 방법은 스코프 빌더(coroutineScope)를 이용하는 것.

    import kotlinx.coroutines.*
    
    suspend fun doOneTwoThree() = coroutineScope {
        launch {
            println("launch1: ${Thread.currentThread().name}")
            delay(1000L)
            println("3!")
        }
    
        launch {
            println("launch2: ${Thread.currentThread().name}")
            println("1!")
        }
    
        launch {
            println("launch3: ${Thread.currentThread().name}")
            delay(500L)
            println("2!")  
        }
        println("4!")
    }
    
    fun main() = runBlocking {
        doOneTwoThree()
        println("runBlocking: ${Thread.currentThread().name}")
        println("5!")
    }

    runBlocking은 현재 스레드를 멈추게 만들고 기다리지만, coroutineScope는 현재 스레드를 멈추게 하지 않음.

    호출한 쪽이 suspend 되고 시간이 되면 다시 활동하게 됨.

    Job을 이용한 제어

    코루틴 빌더 launch 는 Job 객체를 반환하며 이를 통해 종료될 때까지 기다릴 수 있음.

    import kotlinx.coroutines.*
    
    suspend fun doOneTwoThree() = coroutineScope {
        val job = launch {
            println("launch1: ${Thread.currentThread().name}")
            delay(1000L)
            println("3!")
        }
        job.join()
    
        launch {
            println("launch2: ${Thread.currentThread().name}")
            println("1!")
        }
    
        launch {
            println("launch3: ${Thread.currentThread().name}")
            delay(500L)
            println("2!")
        }
        println("4!")
    }
    
    fun main() = runBlocking {
        doOneTwoThree()
        println("runBlocking: ${Thread.currentThread().name}")
        println("5!")
    }

     

    'Book & Lecture > FastCampus' 카테고리의 다른 글

    취소와 타임아웃 #3  (0) 2022.04.15
    스코프 빌더 #1  (0) 2022.04.14
    코루틴 등장 #0  (0) 2022.04.14
    대용량 서비스를 위한 아키텍처 with Redis #0  (0) 2021.11.29