GlobalScope.launch {} : 코루틴을 생성하기 위한 코루틴 빌더이며 실행중인 스레드를 블록하지 않음
fun main(){
GlobalScope.launch {
delay(1000) //1
println("world") //오기전에 종료
}
println("hello") //2
}
// hello
- 위의 코드는 hello를 찍은 후 쓰레드가 종료된다
runBlocking{} : 주어진 블록이 완료될때까지 현재 스레드를 멈추는 새로운 코루틴을 생성하여 실행하는 코루틴 빌더
runBlocking {
GlobalScope.launch {
delay(1000) //1
println("world") //오기전에 종료
}
println("hello") //2
}
// hello
- 그러나 위 코드 역시 hello를 찍은 후 쓰레드가 종료된다
- GlobalScope.launch 는 최상위 코루틴을 생성하며, 이는 앱의 전체 생명주기와 독립적으로 동작
- GlobalScope.launch로 생성된 코루틴은 runBlocking의 자식으로 간주되지 않음
job.join
runBlocking {
val job = GlobalScope.launch {
delay(1000L)
println("World!")
}
println("Hello,")
job.join()
}
- GlobalScope.launch{ } 빌더를 이용해 생성한 코루틴이 종료될 때까지 대기한 후 종료
- 언제 끝날지 모르는 함수에서 사용
launch : 코루틴을 생성하기 위한 코루틴 빌더이며 실행중인 스레드를 블록하지 않음
runBlocking {
launch {
delay(1000) //1
println("world") //3
}
println("hello") //2
}
// hello
// world
- 코루틴이 runBlocking의 자식으로 생성되어 부모 코루틴이 자식 코루틴의 완료를 기다림
- job.join을 사용하지 않아도 자식의 완료를 기다림
coroutinscope : 코루틴 스코프를 생성하는 일시 중단 함수 기존 코루틴의 스코프를 확장하는 역할
runBlocking {
coroutinescope {
delay(1000) // 1
println("world") // 2
}
println("hello") // 3
}
// world
// hello
- 모든 자식이 종료될때까지 다음 블록(println("hello"))으로 넘어가지 않음
suspend : 중단함수(ex. delay())들을 호출 할 수 있음
fun main(){
runBlocking {
launch {
doWorld()
}
println("Hello,")
}
}
suspend fun doWorld() {
delay(1000L)
println("World!")
}
예제 1
runBlocking {
launch {
delay(200L) //1
println("Task from runBlocking") //5
}
coroutineScope {
launch {
delay(500L) //2
println("Task from nested launch") //6
}
delay(100L) //3
println("Task from coroutine scope") //4
}
println("Coroutine scope is over") //7
}
//Task from coroutine scope
//Task from runBlocking
//Task from nested launch
//Coroutine scope is over
예제 2
runBlocking {
repeat(100_000) {
launch {
delay(1000L)
print(".")
}
}
}
- 1초를 기다린 후 . 을 찍는 십만개의 코루틴이 생성됨 -> out of memory 발생
예제 3
runBlocking {
GlobalScope.launch {
repeat(100000) {
delay(1000L)
println(".")
}
}
delay(3000L)
}
- 1초를 기다린 후 . 을 찍는 십만개의 코루틴이 생성되지만 3초가 지난 후 프로그램이 종료됨
- 즉 허용된 시간 동안만 동작한 결과를 만들어 냄
요약
- runblocking {} 은 동기적, 코루틴을 차단하여 실행 즉 {} 안에 정의된 코드들은 launch 같은거 없이는 그냥 동기적으로 실행됨 하지만 안에 정의된 코드들이 모두 실행되어야 다음 코드로 넘어감 (블로킹)
- GlobalScope.launch {} 는 비동기적, 완료를 기다리지 않으며 프로그램의 생명주기와 관계없이 백그라운드에서 실행
- coroutineScope.launch {} 는 비동기적, {}안에 정의된 코드들이 완료될때까지 기다림
https://myungpyo.medium.com/reading-coroutine-official-guide-thoroughly-part-0-20176d431e9d
Reading Coroutine official guide thoroughly — Part 0
요즘 안드로이드 앱 개발자들은 주개발 언어가 Java 에서 Kotlin 으로 많이 전환 되고 있다고 생각합니다. iOS 가 objective-c 에서 swift 로 전환할 때 처럼 안드로이드 SDK 공식 가이드에서도 Kotlin 과 Java
myungpyo.medium.com
'Language' 카테고리의 다른 글
[Kotlin] - Channels (0) | 2025.02.09 |
---|---|
[Kotlin] - 기본 문법 정리 (1) | 2025.02.02 |
[Kotlin] 제네릭 generic타입 (0) | 2025.02.02 |
[Kotlin] 코루틴 (2) - Cancellation and Timeouts (1) | 2025.02.01 |