코루틴은 뭘까.
A coroutine is an instance of suspendable computation.
https://kotlinlang.org/docs/coroutines-basics.html#your-first-coroutine
개념적으로 스레드와 비슷하다.
그런데 하나의 스레드에서만 돌아가는 건 아니고 멈췄다가 다른 스레드에서 재개할 수 있다고 한다.
launch는 코루틴 빌더이다. 새 코루틴을 만들고 launch내의 코드가 새 코루틴에서 실행되는데 다른 나머지 코드와 같이 실행된다.
delay는 코루틴이 잠들게 된다. 이 때 다른 코루틴이 delay로 인해 잠든 코루틴이 쓰던 스레드를 사용할 수 있다.
runBlocking은 코루틴 빌더이다. {} 내 블럭이 수행될 때 까지 다음 코드가 수행되지 않는다. launch는 corutineScope에서만 선언되어야 하는데 runBlocking이 coroutinScope이기 때문에 아래 예문에서 runBlocking 없이 launch만 쓸 수는 없다.
fun main() = runBlocking {
launch {
delay(1000L)
println("World!")
}
println("Hello")
}
Kotlin 공식 문서의 launch 설명이 한번에 이해가 되지는 않았다. launch가 선언되면 코루틴이 만들어지고 다른 나머지 코드오 같이 실행된다고 하는데 왜 launch 내의 코드가 아니라 나머지 코드가 먼저 실행이 될까. 혼자 생각해보니 runBlocking이 열리면서 일단 한 스레드(여기서는 아마 Main스레드)에서 작업을 하는데 launch가 나오면서 코루틴이 만들어지고 이 launch 내부의 코드들은 launch외부의 코드들과 다른 코루틴이기 때문에 runBlocking가 사용중인 스레드의 큐에 따로 담겨진다. 그래서 나머지 코드들이 실행되고 난 후에 큐에서 다음 Task(Task란 표현이 맞는지는 모르겠지만)인 launch의 코루틴이 실행된다.
그럼 delay는 어떻게 작동될까.
fun main() = runBlocking {
launch {
println("World!")
}
delay(1000L)
println("Hello")
}
launch 코루틴이 만들어지고 나머지 코드를 실행하려고 하는데 delay가 있다. 1초동안 잠들어 있다가 println문을 실행하는데 이 때 잠들어 있을 때 그냥 스레드에서 작업하지 않고 점유만 하는게 아니라 1초동안 다른 Task(여기서는 launch 코루틴)가 스레드에서 작업하고 1초가 끝나면 다시 남은 코드(print문)를 실행한다. runBlocking 안에 있기 때문에 dealy문과 println문 부분 역시 코루틴이고 하나의 코루틴에서 delay를 통해 잠이 든다면 다른 코투린이 그 스레드를 이용하여 작업을 할 수 있는 구조로 이해하면 될 것 같다.
'Kotlin > 공부노트' 카테고리의 다른 글
Coroutine - 5. suspending function, async (0) | 2022.04.04 |
---|---|
Coroutine - 4. Cancel, isActive (0) | 2022.03.24 |
Coroutine - 3. job, join (0) | 2022.03.17 |
Coroutine - 2. Structured concurrency, suspend, coroutineScope (0) | 2022.03.12 |
댓글