Java/Kotlin
-
[Coroutine] 코루틴 학습 - 9 (Coroutine scope function)Java/Kotlin 2022. 5. 7. 10:05
GlobalScope 두 개 이상의 일시중단 함수를 병렬적으로 수행하기 위한 가장 손쉬운 방법은 GlobalScope.async()를 호출하는 것이다. 하지만 GlobalScope는 지양해야하는데, 우선 GlobalScope의 정의를 먼저 살펴보면.. public object GlobalScope : CoroutineScope { override val coroutineContext: CoroutineContext get() = EmptyCoroutineContext } GlobalScope의 정의를 살펴보면 coroutineContext가 EmptyCoroutineContext이다. 코루틴 스코프 내에서 GlobalScope를 사용하면 부모 코루틴의 컨텍스트를 덮어쓰게 되고, 아래와 같은 문제가 발생한..
-
[Coroutine] 코루틴 학습 - 8 (Exception handling)Java/Kotlin 2022. 5. 5. 06:56
Exception handling 코루틴은 익셉션이 발생하면 해당 코루틴을 cancel 시키고, 해당 익셉션을 부모 코루틴으로 전파한다. 익셉션을 전파받은 부모 코루틴은 자신과 자신의 자식 코루틴들을 cancel 시키고, 또 다시 자신의 부모 코루틴으로 익셉션을 전파한다. 위 과정을 반복해서 최상위 코루틴까지 예외가 전파된다. fun main(): Unit = runBlocking { launch { launch { delay(1000) throw Error("Some error") } launch { delay(2000) println("출력되지 않는다.") } launch { delay(300) println("출력된다.") } } launch { delay(2000) println("출력되지 않는다..
-
[Coroutine] 코루틴 학습 - 7 (Cancellation)Java/Kotlin 2022. 5. 3. 10:12
Cancellation Job 인터페이스는 cancel() 메서드를 가지고 있다. 코루틴은 첫 번째 일시중단 지점에서 job을 중단한다. job에 자식 코루틴이 포함되어 있다면 자식 코루틴 또한 cancel 된다. job이 cancel되고 나면, 부모 코루틴으로써 새로운 코루틴 실행할 수 없다. suspend fun main(): Unit = coroutineScope { val job = launch { repeat(1_000) { i -> delay(200) println("Printing number $i") } } delay(1100) job.cancel() job.join() println("Cancelled successfully") } // Printing number 0 // Printin..
-
[Coroutine] 코루틴 학습 - 6 (Job and children awaiting)Java/Kotlin 2022. 5. 1. 00:18
Job과 children의 관계 자식은 부모의 컨텍스트를 상속받는다. 부모는 모든 자식들이 종료될 때까지 일시중단 된다. 부모가 cancel되면, 자식 코루틴들도 cancel된다. 자식이 destroy되면, 부모 또한 destroy된다. fun main(): Unit = runBlocking(CoroutineName("main")) { val name = coroutineContext[CoroutineName]?.name println(name) // main launch { delay(1000) val name = coroutineContext[CoroutineName]?.name println(name) // main } } Job Job은 생명주기에서 cancel 가능한 작업을 말한다. Job의 라..