fun main() {
println("START")
newRoutine()
println("END")
}
fun newRoutine() {
val num1 = 1
val num2 = 2
println("${num1 + num2}")
}
main
루틴이 “START”를 출력하고 newRoutine
호출newRoutine
은 1과 2를 계산해 3을 출력newRoutine
이 종료되고 main
루틴으로 돌아옴main
루틴은 “END”를 출력하고 종료newRoutine
이 종료된 후에는 1과 2가 메모리에서 사라지고 접근할 수 없게 된다.dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.2")
}
fun main(): Unit = runBlocking {
println("START")
launch {
newRoutine()
}
yield()
println("END")
}
suspend fun newRoutine() {
val num1 = 1
val num2 = 2
yield()
println("${num1 + num2}")
}
runBlocking
launch
suspend fun
suspend fun
을 호출할 수 있다.yield
도 suspend fun
이다.yield()
START
END
3
main
코루틴이 runBlocking
에 의해 실행되고 “START”가 출력launch
에 의해 코루틴이 생기지만 newRoutine
실행은 바로 일어나지 않는다.main
코루틴 안에서 yield()
가 되면 main
은 newRoutine
코루틴에게 실행을 양보하여 launch
가 만든 새로운 코루틴이 실행된다.newRoutine
은 다시 yield()
를 호출하고 main
코루틴으로 돌아온다.main
루틴은 “END”를 출력하고 종료된다.newRoutine
이 종료되지 않았으니 3을 출력하고 종료된다.fun printWithThread(str: Any) {
println("[${Thread.currentThread().name}] $str")
}
println
대신 printWitThread
를 적용하고 Intellij에 vm option으로 -Dkotlinx.coroutines.debug
를 주게 되면 어떤 코루틴에서 실행되는지도 알 수 있다.[main @coroutine#1] START
[main @coroutine#1] END
[main @coroutine#2] 3