Вступить в клуб →
сложнаявопросКорутины и Flow

job.cancel не останавливает тяжёлый цикл

В отчётном экране считается большая агрегация:

val job = scope.launch(Dispatchers.Default) {
    var sum = 0L
    for (i in 0..2_000_000_000L) {
        sum += heavyStep(i) // обычная функция, не приостанавливающая
    }
    _state.value = Result(sum)
}

// пользователь ушёл с экрана
job.cancel()

Что произойдёт после вызова отмены?

  • Цикл доработает до конца: отмена кооперативная, а тело без точек приостановки её не проверяет
  • Отмена не сработает, потому что корутина запущена на диспетчере для вычислений: его задачи прерывать нельзя
  • Цикл прервётся немедленно: отмена останавливает выполнение корутины на текущей инструкции
  • Корутина упадёт с исключением отмены где-то в середине цикла, и результат в состояние записан не будет

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела