코드 블록이 수행될때까지 다른 작업을 수행하지 않고 실행함
(안드로이드에서 사용하면 안 됨 ANR 야기)
코루틴 스코프는 코루틴을 제대로 처리하기 위한 정보, CorotuineContext를 가지고 있음
import kotlinx.coroutines.*
fun main() = runBlocking{
println(this)
println(coroutineContext)
}
// "coroutine#1":BlockingCoroutine{Active}@36d64342
[CoroutineId(1), "coroutine#1":BlockingCoroutine{Active}@36d64342, BlockingEventLoop@19dfb72a]
launch는 새로운 코루틴을 만들어서 코드를 수행하게하고 다른 코드를 함꼐 수행하게함.
가능하다면 다른 블록의 코루틴이 같이 실행됨
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
println("World!")
}
println("Hello")
}
// Hello
// World!
runBlocking이 실행되고 launch가 실행된다.
runBlocking이 메인스레드에서 실행되고 있기 때문에 lauch는 기다림.
많은 예제에서 확인할 수 있다.
해당스레드를 잠시 해제하고 쉬어가는 의미로 이해하면 좋을 것 같다.
다른 코루틴이 사용할 수 있게 양보함
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
println("launch: ${Thread.currentThread().name}")
println("World!")
}
println("runBlocking: ${Thread.currentThread().name}")
delay(500L)
println("Hello")
}
runBlocking: main @coroutine#1
launch: main @coroutine#2
World!
Hello
runBlocking이 먼저 호출되었지만 delay이되어 launch에게 양보하는 것을 확인할 수 있다.
delay와 같다고 생각할 수 있지만 다르다
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
println("launch: ${Thread.currentThread().name}")
println("World!")
}
println("runBlocking: ${Thread.currentThread().name}")
Thread.sleep(500)
println("Hello")
}
runBlocking: main @coroutine#1
Hello
launch: main @coroutine#2
World!
iimport kotlinx.coroutines.*
fun main() = runBlocking {
launch {
println("launch1: ${Thread.currentThread().name}")
delay(1000L)
println("3!")
}
launch {
println("launch2: ${Thread.currentThread().name}")
println("1!")
}
println("runBlocking: ${Thread.currentThread().name}")
delay(500L)
println("2!")
}
runBlocking: main @coroutine#1
launch1: main @coroutine#2
launch2: main @coroutine#3
1!
2!
3!
delay를 모두 지우면 제일 바깥 runBlocking 블록의 2 -> 3 -> 1 출력된다.
delay를 주게 되면 숫자 그대로 1 -> 2 -> 3이 출력된다.
import kotlinx.coroutines.*
fun main() {
runBlocking {
launch {
println("launch1: ${Thread.currentThread().name}")
delay(1000L)
println("3!")
}
launch {
println("launch2: ${Thread.currentThread().name}")
println("1!")
}
println("runBlocking: ${Thread.currentThread().name}")
delay(500L)
println("2!")
}
print("4!")
}
runBlocking: main @coroutine#1
launch1: main @coroutine#2
launch2: main @coroutine#3
1!
2!
3!
4!
runBlocking이 끝날때까지 4가 출력이 안 되는 것을 확인할 수 있다.
delay,sleep과 같이 suspend 함수는 중단점(Suspension Point)가 되며 코루틴이 잠이 들 수 있고 다른 코루틴에 의해 깨어날 수 있다.