Существует ли иерархия в исполнении корутин

«Существует ли иерархия в исполнении корутин» — вопрос из категории Coroutines и Flow, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Корутины в Kotlin выполняются в рамках CoroutineScope, которая определяет их жизненный цикл и отмену. Иерархия существует через parent-child отношения:

  1. Родительская корутина автоматически отменяет все дочерние при отмене
  2. Дочерняя корутина может отменить родительскую только через явный вызов CoroutineExceptionHandler

Пример:

val parentJob = CoroutineScope(Dispatchers.IO).launch {
    val child1 = launch { /* ... */ }
    val child2 = async { /* ... */ }
    // при отмене parentJob отменятся child1 и child2
}

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