
코루틴 스코프는 코루틴을 제대로 처리하기 위한 정보인 코루틴 컨텍스트를 가진다. 이는 this.coroutineContext 로 가져올 수 있다.
runBlocking 은 코드 블록 수행하기 전까지 다른 애들을 못하게 막아둔다.
아래의 예시에서 runBlocking 을 하면 해당 코드 블록을 수행하기 전까지 다른 애들을 막기 때문에 다음과 같은 결과가 나온다. Start of main -> Inside runBlocking -> End of runBlocking -> End of main
fun main() {
println("Start of main")
runBlocking {
println("Inside runBlocking")
delay(1000L)
println("End of runBlocking")
}
println("End of main")
}
이번엔 lauch 코루틴 빌더이다. runBlocking 은 코드 블록 수행하기 전까지 다른 애들을 못하게 막는건데 lauch 는 할 수 있다면 같이 수행되는 것이다.
예를 들어 아래 코드에서 runBlocking 이 먼저 호출이 되어서 Hello 가 먼저 출력되고 그 다음에 World 가 출력된다. runBlocking 은 코드 수행까지 기다리고 launch 는 기다리지 않는다.
fun main() = runBlocking {
lauch{
print("World")
}
print("Hello")
}
잠깐 쉬어가는 함수이다. 일반적으로 스레도에서 쉬려면 sleep 을 사용했었다. delay 는 해당 스레드를 해제를 하고 쉬는 것이다. 이건 sleep 과 달리 해제해서 다른 애가 쓸 수 있도록 할 수 있다.
딜레이 함수에 지정하는 값은 L 값인데 이건, 밀리세컨드 단위이다. delay(500L) = 500 밀리세컨드
아래 코드 예시에서는 World 가 먼저 호출되고 Hello 가 호출된다. delay 에서 잠깐 스레드 해제를 해서 lauch 가 먼저 쓰도록 양보하기 때문이다.
fun main() = runBlocking {
lauch{
print("World")
}
delay(500L)
print("Hello")
}
코루틴의 장점 : 하나의 스레드 밖에 없지만 양보를 하며 최선의 효율을 내는 것.
만약 delay 가 아닌 sleep 을 쓰면 다른 스레드에게 양보하지 않고 자기가 바쁘게 쉬는 거여서 runBlocking 이 먼저 실행되고 나서 launch 가 실행된다.
따라서, 아래 예시에서 Hello 가 먼저 출력되고 World 가 출력된다.
fun main() = runBlocking {
lauch{
print("World")
}
Thread.sleep(500)
print("Hello")
}