2장. 코루틴 인 액션

Minsuk Jang·2021년 10월 21일
0
post-thumbnail

UI 스레드

CallFromWrongThreadException

  • UI 스레드 외 다른 스레드가 뷰를 업데이트할 때 발생하는 예외

NetworkOnMainThreadException

  • 자바에서는 기본적으로 I/O 동작은 블로킹이 된다.
    • ex. 웹 서비스 호출 시, 응답이 수신되거나 타임 아웃 / 오류가 발생하기 전까지 모든 스레드가 블로킹
  • UI 스레드가 블로킹 된다는 것은 사용자와 상호작용이 블로킹 된다는 의미

CoroutineDispatcher

  • 스레드 간에 코루틴을 분산하는 오케스트레이터

async

  • 결과 처리를 위한 목적
  • Deferred를 반환
  • 취소 불가능한 넌 블로킹 퓨처(non-blocking cancellable future)
  • join()는 예외를 전파 x / await()는 예외 전파 o
//join()의 경우
fun main(args : Array<String>) = runBlocking<Unit>{
    val dispatcher = newSingleThreadContext(name = "ServiceCall")
    val task = GlobalScope.async {
        doSomething()
    }

    /*
    join()는 예외를 전파하지 않는다.
    따라서, 따로 예외 처리를 설정해 둬야 한다.
     */
    task.join()

    if(task.isCancelled){
        val exception = task.getCompletionExceptionOrNull()
        println("Error cause: $exception")
    }
    println("Complete")
}

fun doSomething(){
    throw UnsupportedOperationException("Can't do")
}
//await()의 경우
fun main(args : Array<String>) = runBlocking<Unit>{
    val dispatcher = newSingleThreadContext(name = "ServiceCall")
    val task = GlobalScope.async {
        doSomething()
    }

    /*
    await()의 경우, join()는 다르게 다른 에러를 던진다.
     */
    task.await()
    println("Complete")
}

fun doSomething(){
    throw UnsupportedOperationException("Can't do")
}

launch

  • 결과를 반환하지 않는 코루틴
  • 파이어-앤-포겟(Fire-and-forget) 시나리오

    fire-and-forget
    미사일을 발사(fire)하고 나면 그후 미사일은 알아서 표적을 향해 날아가는데, 미사일에 대해 잊고 있어도(Forget) 알아서 표적에 명중한다는 것으로, 실행 후 결과에 대해서는 신경 쓸 필요 없다는 의미

//launch 블록
fun main(args : Array<String>) = runBlocking<Unit>{
    val dispatcher = newSingleThreadContext(name = "ServiceCall")
    val task = GlobalScope.launch {
        doSomething()
    }
    
    task.join()
    println("Complete")
}

fun doSomething(){
    throw UnsupportedOperationException("Can't do")
}

에러를 던지고 Complete를 호출하는 결과를 확인할 수 있다.

참고

  • Learning Concurrency in Kotlin
profile
Positive Thinking

0개의 댓글