일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 10819 파이썬
- 5582 DP
- 1644 파이썬
- Android mvp
- 1806 파이썬
- 코루틴 플로우
- Coroutine Flow
- Android Room
- 백준 1644
- 1753 파이썬
- 자바
- 백준 2096
- 투포인터 알고리즘
- android hilt
- 1806 백준
- 6588 파이썬
- 자료구조
- 2096 파이썬
- 1753 다익스트라
- 1806 투포인터
- java
- 안드로이드 hilt
- 백준 10819
- flow buffering
- 백준 5582
- git local remote
- 이진 탐색
- Jetpack Room
- 5582 파이썬
- 1003 파이썬
- Today
- Total
Gemstone's Devlog
[코루틴 실습] 처음 만나는 코루틴 본문
예제 1 : 간단한 코루틴
아주 간단한 코루틴을 수행해봅시다.
코루틴을 만드는 가장 간단한 함수는 runBlocking이라고 합니다. 이렇게 코루틴을 만드는 함수를 코루틴 빌더라고 합니다. runBlocking은 코루틴을 만들고 코드 블록이 수행이 끝날 때까지 runBlocking 다음의 코드를 수행하지 못하게 막습니다. 그래서 블로킹(blocking)인거죠.
import kotlinx.coroutines.*
fun main() = runBlocking {
println(Thread.currentThread().name)
println("Hello")
}
스레드 이름이 main @coroutine1 입니다.
메인 스레드에서 수행되는데 뒤에 수식어 @coroutine1 이 붙어 있습니다.
예제 2 : 코루틴 빌더의 수신 객체
runBlocking 안에서 this를 수행하면 코루틴이 수신 객체(Receiver)인 것을 알 수 있습니다.
수신객체 = extension lamda
람다를 확장한 것처럼 쓰일 수 있다는 뜻
import kotlinx.coroutines.*
fun main() = runBlocking {
println(this)
println(Thread.currentThread().name)
println("Hello")
}
"coroutine#1":BlockingCoroutine{Active}@36d64342a 이런 형태의 결과가 나옵니다.
BlockingCoroutine은 CoroutineScope의 자식입니다. 코틀린 코루틴을 쓰는 모든 곳에는 코루틴 스코프(CoroutineScope)가 있다고 생각하면 됩니다.
코루틴의 시작은 코루틴 스코프다.
외웁시다.
예제 3 : 코루틴 컨텍스트
코루틴 스코프는 코루틴을 제대로 처리하기 위한 정보, 코루틴 컨텍스트(Coroutine Context)를 가지고 있습니다.
수신 객체의 coroutineContext를 호출해 내용을 확인해봅시다.
import kotlinx.coroutines.*
fun main() = runBlocking {
println(coroutineContext)
println(Thread.currentThread().name)
println("Hello")
}
예제 4 : launch 코루틴 빌더
이제 코루틴 내에서 다른 코루틴을 수행해 봅시다.
이번에는 launch란 빌더를 사용해서 코드를 수행합니다. launch는 코루틴 빌더입니다.
새로운 코루틴을 만들기 때문에 새로운 코루틴 스코프를 만들게 되고요.
launch는 "할 수 있다면 다른 코루틴 코드를 같이 수행" 시키는 코루틴 빌더입니다.
import kotlinx.coroutines.*
// 이중으로 되어있는 코루틴 계층 구조
fun main() = runBlocking {
launch {
println("launch: ${Thread.currentThread().name}")
println("World!")
}
println("runBlocking: ${Thread.currentThread().name}")
println("Hello")
}
launch 코루틴 빌더에 있는 내용이 runBlocking이 있는 메인 흐름 보다 늦게 수행된 것을 볼 수 있습니다.
둘 다 메인 스레드(main)를 사용하기 때문에 runBlocking의 코드들이 메인 스레드를 다 사용할 때 까지 launch의 코드 블록이 기다리는 것입니다.
launch를 이용해 동시에 여러 코드를 수행하는 것은 다음에 다루겠습니다.
runBlocking은 Hello를 출력하고 나서 종료하지는 않고 launch 코드블록의 내용이 다 끝날 때까지 기다립니다.
예제 5 : delay 함수
Hello를 조금 더 늦게 수행시키기 위해서는 delay 함수를 호출해 봅시다. 인자로 밀리세컨드 단위의 시간을 지정할 수 있습니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
println("launch: ${Thread.currentThread().name}")
println("World!")
}
println("runBlocking: ${Thread.currentThread().name}")
delay(500L)
println("Hello")
}
프린트 문이 호출된 이후 delay가 호출되는데
이때 runBlocking의 코루틴이 잠이 들게 되고 launch의 코드 블록이 먼저 수행됩니다.
'Kotlin (Android)' 카테고리의 다른 글
Coroutine 정리 (0) | 2022.06.07 |
---|---|
[의존성 주입] Hilt 정리 (0) | 2022.04.05 |
Coroutine 정리 (0) | 2022.03.28 |
코틀린 코테 테크닉 (0) | 2022.01.21 |
ViewModel과 SIS(Saved Instance State) (0) | 2022.01.17 |