Coroutine 이해하기 3
지금까지는 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의 더 다양한 함수들을 사용해보겠습니다.