Почему SupervisorJob отменяте все дочерние корутины когда возникает ошибка?

Есть два типа задач в корутинах:

  1. Job
  2. SupervisorJob

Первый тип предназначен для отмены всех дочерних корутин, как только возникает ошибка в одной из них. Но есть SupervisorJob который предназначен для противоположной работы: после возникновения ошибки в одной из дочерних корутин остальные должны продолжать свою работу.

код:

fun main() {
    val exceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable ->
        println("Caught exception: $throwable")
    }

    val scope = CoroutineScope(SupervisorJob())

    scope.launch(exceptionHandler) {
        launch {
            println("Starting coroutine 1")
            delay(100.milliseconds)
            throw RuntimeException()
        }

        launch {
            println("Starting coroutine 2")
            delay(1.seconds)
            println("Coroutine 2 completed")
        }
    }

    Thread.sleep(3000)
}

Логи:

Starting coroutine 1
Starting coroutine 2
Caught exception: java.lang.RuntimeException

Process finished with exit code 0

Есть родительская корутина и две дочерние. Ошибка возникла в первой дочерней корутине, и согласно логу мы видим, что вторая корутина не заканчивает роботу никогда (хотя должна была).

Что у меня упущено здесь?


Ответы (0 шт):