Перейти к содержимому
На этой странице

Coroutine

Все темы Kotlin Developer

Что представляют собой корутины в Kotlin?

Корутины в Kotlin представляют собой легковесные потоки выполнения, которые позволяют выполнять асинхронные операции без блокировки потока. Они позволяют писать асинхронный код так, будто он синхронный, что облегчает разработку и поддержку. Корутины позволяют эффективно использовать ресурсы процессора и позволяют избежать проблем, связанных с созданием большого количества потоков.


Что такое coroutine и как они реализуются в Kotlin?

Coroutine (корутина) — это легковесная единица выполнения, которая позволяет выполнять асинхронные задачи без блокировки потоков. В Kotlin корутины реализуются с помощью библиотеки kotlinx.coroutines.

Корутины запускаются в специальных контекстах, которые определяют их поведение (например, Dispatchers.IO для ввода-вывода, Dispatchers.Main для работы с UI).

Пример:

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        delay(1000L)
        println("Hello, Coroutine!")
    }
    println("Hello,")
}

Как использовать launch и runBlocking в Kotlin?

Использование launch и runBlocking:

  • launch: Запускает новую корутину без блокировки текущего потока. Используется для выполнения асинхронных задач, которые не возвращают результат.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        launch {
            delay(1000L)
            println("Hello, Coroutine!")
        }
        println("Hello,")
    }
  • runBlocking: Запускает корутину и блокирует текущий поток до завершения выполнения всех вложенных корутин. Обычно используется для тестов или в main функции.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        launch {
            delay(1000L)
            println("Hello, Coroutine!")
        }
        println("Hello,")
    }

Объясните разницу между suspend функцией и обычной функцией.

Разница между обычной и suspend функцией:

  • suspend-функция может приостанавливать и возобновлять выполнение. Её вызывают из корутины или другой suspend-функции. delay и withContext являются функциями библиотеки kotlinx.coroutines. Сам модификатор suspend не переключает поток и не делает блокирующий код неблокирующим.

    suspend fun doSomething() {
        delay(1000L)
        println("Done")
    }
  • Обычная функция: Функция, которая выполняется последовательно и не может быть приостановлена. Не может вызывать suspend функции напрямую.


Какие преимущества дают coroutines по сравнению с классическими потоками?

Преимущества coroutines перед классическими потоками:

  • Легковесность: Корутины потребляют меньше ресурсов, чем потоки. Тысячи корутин могут работать одновременно, в отличие от потоков.

  • Простота синтаксиса: Корутины позволяют писать асинхронный код в синхронном стиле, что делает код более читаемым и поддерживаемым.

  • Контролируемая конкурентность: Корутины предоставляют более гибкий механизм управления конкурентностью через контексты и диспетчеры (Dispatchers).

  • Безопасность: Structured concurrency связывает время жизни дочерних корутин с родительской областью. Доступ к общему изменяемому состоянию всё равно требует Mutex, атомарных операций или ограничения выполнения одним потоком.

Собеседования: Kotlin

Смотри записи интервью, узнай, какие вопросы задают и как отвечают кандидаты.

Вопросы и ответы

Не нашли ответ? Напишите мне в чат. Я делаю Шпаргалку и сам отвечаю на сообщения. Расскажите, что не работает или чего вам не хватает. Может, смогу сразу взять это в работу.

Откуда взяты вопросы?

Из реальных собеседований. Основой подборки стал опыт Вадима Новосёлова: он проходил интервью и записывал вопросы. Подробнее о материалах.

Насколько эти вопросы актуальны?

Эти вопросы встречались нам на реальных собеседованиях в 2025 году. Мы регулярно проходим собеседования и пополняем подборку новыми вопросами. Основы профессии и ключевые технологии остаются востребованными годами, а детали конкретных инструментов и версий стоит сверять с текущей документацией.

На какой уровень рассчитана подборка?

Мы проходили собеседования на вакансии уровня Middle+, а иногда и на Senior-позиции. Вопросы из этих интервью вошли в подборку. Направления работы: Kotlin-разработчик, Android-разработчик, Backend-разработчик на Kotlin. Глубина обсуждения зависит от вакансии: будь готов объяснить основную идею, привести практический пример и разобрать ограничения и альтернативы решения.

Этот вопрос точно будет на моём собеседовании?

Гарантии нет: набор вопросов зависит от компании, задач команды, уровня вакансии и самого интервьюера. Эти вопросы уже встречались на реальных собеседованиях, но на твоём интервью ту же тему могут проверить другой формулировкой, практической задачей или обсуждением твоего опыта. Используй подборку, чтобы разобраться в теме: объясняй идею своими словами, приводи примеры и готовься обсудить ограничения и альтернативы решения. Так будет проще ответить и на знакомый вопрос, и на неожиданные уточнения.