Простой вопрос по Kotlin Coroutines или как не потеряться в измерениях

Представь, что красная область внутри функции main () и зеленая область внутри launch — это два разных измерения.
Кстати, код внутри launch — это и есть «корутина». Далее я буду называть launch таким образом

e7bd0198ca3a6ae044e68409b4d925c8.png

Давай узнаем разницу между измерениями:

  • Красное — это основное измерение (основной поток программы)

  • Зеленое — измерение, где временные задержки (delay) и последовательность выполнения кода могут отличаться от основного потока программы (красного измерения)

При запуске функции main () сначала красное измерение начинает выполнение, в то время как корутины могут начать свою работу параллельно или после запуска красного

Что в итоге происходит в нашем коде:

Когда мы запускаем main (), основной поток выполняет println («Красное измерение»), не дожидаясь delay () в корутине, и программа завершается с фразой Process finished with exit code 0

Но как напечатать сначала «Зеленое измерение», а потом «Красное измерение»?

Нам нужно сказать программе: «подожди пока выполнится delay (1000), а только потом напечатай «красное измерение»

Для этих целей можем использовать функцию join ()

Добавим ее:

join () приостанавливает красное измерение, пока зеленое не завершит delay ()

Видим ошибку:

bd9a31d1f6ab4a3dd8a774fff18b20df.png

Нам предлагают добавить к функции main () слово suspend

suspend означает, что функция может приостановить свое выполнение
Обращу внимание на то, что приостанавливается функция main (), а корутина активна и выполняется

Итак, сейчас красное измерение будет приостановлено

9f69807342dd8a5173723be7d5ddd361.png

Добавив join (), мы имеем:

А теперь вопрос на засыпку!

Представим, что нет возможности использовать join ()

Как сделать так, чтобы снова выводилось:
Зеленое измерение
Красное измерение

Ответ на вопрос. Не открывай раньше времени, подумай сначала сам

Нужно перенести delay () в красное измерение

Теперь suspend main () не может пройти мимо delay () и дождется его выполнения

Что нужно запомнить:

  1. suspend функции должны быть вызваны внутри корутин или других suspend функций

  2. join () — это suspend функция. В нашем случае она приостанавливает другую suspend функцию (а именно main)

  3. suspend функции выделены специальным значком

48498af2417c41527a46ba01705bc234.png

4. Корутины запускаются не мгновенно, на это требуется какое-то время

Еще небольшие задачки:

Как думаешь, что выведет этот код:
Ответ проверь в IDEA или напиши в комментарии :)

Задача 1

Задача 1

Задача 2

Задача 2

Задача 3

Задача 3

© Habrahabr.ru