[Coroutine] 코루틴(2)

Janzizu·2022년 9월 10일
0
post-thumbnail

suspend함수 안에서 코루틴 빌더 호출

import kotlinx.coroutines.*

suspend fun doOneTwoThree() {
    launch {
        println("launch1: ${Thread.currentThread().name}")
        delay(1000L)
        println("3!")
    }
    launch {
        println("lanch2: ${Thread.currentThread().name}")
        println("1!")
    }
    launch {
        println("launch3: ${Thread.currentThread().name}")
        println("2!")
    }
    println("4!")
}

fun main() = runBlocking {
    doOneTwoThree()
    println("runBlocking: ${Thread.currentThread().name}")
    println("5!")
}

Unresolved reference: launch
Suspension functions can be called only within coroutine body
Unresolved reference: launch
Unresolved reference: launch

코루틴 빌더는 코루틴 스코프 내에서만 호출해야한다! (error message)

코루틴 스코프

코루틴 스코프는 스코프 빌더를 이용해서 만들 수 있다.

import kotlinx.coroutines.*

suspend fun doOneTwoThree() = coroutineScope {
    launch {
        println("launch1: ${Thread.currentThread().name}")
        delay(1000L)
        println("3!")
    }
    launch {
        println("lanch2: ${Thread.currentThread().name}")
        println("1!")
    }
    launch {
        println("launch3: ${Thread.currentThread().name}")
        println("2!")
    }
    println("4!")
}

fun main() = runBlocking {
    doOneTwoThree()
    println("runBlocking: ${Thread.currentThread().name}")
    println("5!")
}

4!
launch1: main @coroutine#2
lanch2: main @coroutine#3
1!
launch3: main @coroutine#4
2!
3!
runBlocking: main @coroutine#1
5!

runBlocking은 현재 쓰레드를 멈추게 만들고 기다리지만 coroutineScope는 현재 스레드를 멈추게 하지 않는다. 호출한 쪽이 suspend되고 시간이 되면 다시 활동하게 된다.

Job

코루틴 빌더 launch는 Job객체를 반환하며 이를 통해 종료될 때 까지 기다릴 수 있다.
join => 명시적으로 코루틴이 완료되길 기다린다.

코루틴은 가볍다

import kotlinx.coroutines.*

suspend fun doOneTwoThree() = coroutineScope {
    val job = launch {
        println("launch1: ${Thread.currentThread().name}")
        delay(1000L)
        println("3!")
    }
    job.join()
    
    launch {
        println("lanch2: ${Thread.currentThread().name}")
        println("1!")
    }
    
    repeat(1000) {
      launch {
        println("launch3: ${Thread.currentThread().name}")
        println("2!")
    }  
    }
    
    println("4!")
}

fun main() = runBlocking {
    doOneTwoThree()
    println("runBlocking: ${Thread.currentThread().name}")
    println("5!")
}

launch1: main @coroutine#2
3!
4!
lanch2: main @coroutine#3
1!
launch3: main @coroutine#4
2!
launch3: main @coroutine#5
2!
launch3: main @coroutine#6
2!
launch3: main @coroutine#7
2!
launch3: main @coroutine#8
2!
launch3: main @coroutine#9
2!
launch3: main @coroutine#10
2!
launch3: main @coroutine#11
2!
launch3: main @coroutine#12
2!
launch3: main @coroutine#13
2!
launch3: main @coroutine#14
2!

...

코루틴은 협력적으로 동작하기 때문에 여러 코루틴을 만드는 것에 큰 비용이 들지 않는다.

0개의 댓글