카테고리 없음

Coroutine 이해하기 3

WOO_JOO 2022. 12. 13. 23:08

지금까지는 Coroutine Scope는 runBlocking을 사용하였습니다.

이젠 runBlocking 말고 어떤 Scope가 있는지 알아보겠습니다.

 

coroutineScope 선언방법

fun main() {

  coroutineScope {
  	launch {
    
    }
    
    launch {
    
    }
  
  }
  
}

runBlocking과의 차이는 아래와 같습니다.

runBlocking : 작업이 수행되는동안 현재 Thread를 Block

coroutineScope: 현재 Thread를 Block X

 

다음은 Job 입니다.

fun main() = coroutineScope {
    val job = launch {
        /*code*/
    }
}

사실 여태껏 써왔던 launch 는 job으로 리턴 받을 수 있습니다.

Job의 역할은 launch 블록 내에서 수행되는 코드들을 컨트롤 할 수 있습니다.

 

이 Job 으로 어떤 것들을 할 수 있는지 한번 알아보도록 하겠습니다.

그 중 join() 함수 부터 알아보겠습니다.

join() 함수의 사용 결과를 보면 좀 더 명확하게 이해할 수 있을 것 같아서 예제 두개를 먼저 써볼께요.

먼저 join() 함수를 쓰지 않았을 때 입니다.

 fun main() = coroutineScope {
    launch {
        println("launch1: ${Thread.currentThread().name}")
    }

    launch {
        println("launch2: ${Thread.currentThread().name}")
    }
    println("Coroutine!!")
}

실행결과
Coroutine!!
launch1: main @coroutine#2
launch2: main @coroutine#3

다음은 join() 함수를 사용했을때 입니다.

 fun main() = coroutineScope {
    val job = launch {
        println("launch1: ${Thread.currentThread().name}")
    }
    
    job.join()

    launch {
        println("launch2: ${Thread.currentThread().name}")
    }
    println("Coroutine!!")
}

실행결과
launch1: main @coroutine#2
Coroutine!!
launch2: main @coroutine#3

join 함수를 실행 함으로써 우선권은 job 변수가 가져가 코드를 실행한 후 다시 main 에게 넘겨주고, main함수가 print문을 실행한 후 두번째 launch 블록의 코드가 실행되게 됩니다.

 

그럼 여기서 만약 delay() 함수를 사용한다면 어떻게 되는지 보겠습니다.

지난번에 delay() 함수를 사용하면 자원 우선권이 넘어간다는 것 기억 나시나요?

코드 실행 결과를 보겠습니다.

 

 fun main() = coroutineScope {
    val job = launch {
    	delay(500L)
        println("launch1: ${Thread.currentThread().name}")
    }
    
    job.join()

    launch {
        println("launch2: ${Thread.currentThread().name}")
    }
    println("Coroutine!!")
}

실행결과
launch1: main @coroutine#2
Coroutine!!
launch2: main @coroutine#3

네,,, 결과는 똑같습니다.

join() 함수는 해당 job의 코드가 모두 수행될때 까지 Coroutine Scope가 기다려 준다는 것을 할 수 있네요.

 

다음시간에는 Job의 더 다양한 함수들을 사용해보겠습니다.