fun main(): Unit = runBlocking {
    val job1 = launch {
        delay(1_000L)
        printWithThread("Hello 1")
    }
    
    val job2 = launch {
        delay(1_000L)
        printWithThread("Hello 2")
    }
}

스크린샷 2024-06-19 오전 6.53.36.png

새로운 Root Coroutine 을 만들고 싶다면?: 새로운 영역(CoroutineScope )을 만들어야 한다.

fun main(): Unit = runBlocking {
    val job1 = CoroutineScope(Dispatchers.Default).launch {
        delay(1_000L)
        printWithThread("Hello 1")
    }

    val job2 = CoroutineScope(Dispatchers.Default).launch {
        delay(1_000L)
        printWithThread("Hello 2")
    }
}

스크린샷 2024-06-19 오전 6.57.24.png

launchasync 의 예외 발생 차이

CoroutineExceptionHandler

fun main(): Unit = runBlocking {
    val exceptionHandler = CoroutineExceptionHandler { _, exception ->
        printWithThread("Caught $exception")
    }

    val job = CoroutineScope(Dispatchers.Default).launch(exceptionHandler) {
        throw IllegalArgumentException()
    }

    delay(1_000L)
}

코루틴 취소 예외

  1. 발생한 예외가 CancellationException 인 경우
    1. 취소로 간주하고 부모 코루틴에게 전파하지 않는다.
  2. 다른 예외가 발생한 경우
    1. 실패로 간주하고 부모 코루틴에게 전파한다.