Sobes.tech
Back to questions
Junior — Middle
72

Чем отличается SupervisorJob от обычного Job в контексте корутин и управления задачами?

Companies where asked
WildberriesWildberries
СБЕРСБЕР
СовкомбанкСовкомбанк
Юрент

Answer from AI

sobes.tech AI

В Kotlin корутинах Job представляет собой задачу, которая может быть отменена и отслеживается в иерархии корутин. SupervisorJob — это специальный тип Job, который отличается поведением при возникновении исключений в дочерних корутинах.

Основное различие:

  • Job: Если одна из дочерних корутин завершается с ошибкой, то эта ошибка отменяет весь родительский Job и все остальные дочерние корутины.
  • SupervisorJob: Ошибка в одной дочерней корутине не отменяет другие дочерние корутины и не отменяет родительский Job. Это позволяет изолировать ошибки и продолжать выполнение других задач.

Пример:

val supervisor = SupervisorJob()
val scope = CoroutineScope(Dispatchers.Default + supervisor)

scope.launch {
    launch {
        // Эта корутина упадет с исключением
        throw Exception("Ошибка в дочерней корутине")
    }
    launch {
        // Эта корутина продолжит работать, несмотря на ошибку в другой
        delay(1000)
        println("Выполнение продолжается")
    }
}

Использование SupervisorJob удобно, когда нужно, чтобы сбой одной задачи не влиял на выполнение других параллельных задач.