스코프 빌더, 잡 #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!")
}