Что выведет код Senior Корутины и structured concurrency обновлено

Отмена корутины и finally

Вопрос

Что выведет код? По строке на каждый вывод.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try {
            repeat(10) { i ->
                println("tick $i")
                delay(100)
            }
        } finally {
            println("cleanup")
        }
    }
    delay(250)
    job.cancelAndJoin()
    println("cancelled=${job.isCancelled}")
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: tick 0, tick 1, tick 2, cleanup, cancelled=true. За 250 мс корутина успевает напечатать tick 0, tick 1 и tick 2 (моменты 0, 100, 200 мс). cancel прерывает её на очередном delay исключением CancellationException, выполняется finally. cancelAndJoin дожидается завершения, после чего…

Что выведет

tick 0
tick 1
tick 2
cleanup
cancelled=true

Разбор

За 250 мс корутина успевает напечатать tick 0, tick 1 и tick 2 (моменты 0, 100, 200 мс). cancel прерывает её на очередном delay исключением CancellationException, выполняется finally. cancelAndJoin дожидается завершения, после чего isCancelled равен true.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.