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

Асинхронное программирование

Все темы Kotlin Developer

Опишите, что представляют собой диспетчеры (dispatchers) в Kotlin.

Диспетчеры (dispatchers) в Kotlin представляют собой механизм управления потоками выполнения в асинхронном программировании. Они определяют контекст выполнения для сопрограмм, позволяя указать, на каком потоке или пуле потоков должен выполняться код. Kotlin предоставляет несколько встроенных диспетчеров, таких как Dispatchers.Default, Dispatchers.IO, Dispatchers.Main, которые позволяют выполнять код на разных потоках, таких как потоки для выполнения операций ввода-вывода, потоки для выполнения задач в фоновом режиме и потоки для взаимодействия с пользовательским интерфейсом.


Какие способы асинхронного программирования поддерживает Kotlin?

Kotlin поддерживает несколько способов асинхронного программирования:

  1. Coroutines: Основной механизм асинхронного программирования в Kotlin. Позволяет писать асинхронный код в синхронном стиле.

  2. Threads: Использование классов Thread и ExecutorService из Java.

  3. RxJava: Реактивное программирование с использованием библиотеки RxJava.


Объясните, как работают coroutines в Kotlin.

Coroutines (корутины) — это легковесные потоки, управляемые Kotlin. Они позволяют выполнять асинхронные задачи без блокировки потоков.

Корутины работают следующим образом:

  1. Запуск корутины: Корутины запускаются с использованием функций launch или async.

  2. Отложенные задачи: Функции, которые могут быть приостановлены и возобновлены, помечены как suspend.

  3. Контексты корутин: Корутины могут быть запущены в различных контекстах (например, Dispatchers.IO для ввода-вывода).

Пример:

import kotlinx.coroutines.*

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

Как использовать async и await в Kotlin?

async используется для запуска асинхронных задач, которые возвращают результат. await — для ожидания результата выполнения корутины.

Пример:

import kotlinx.coroutines.*

fun main() = runBlocking {
    val deferred: Deferred<Int> = async {
        delay(1000L)
        42
    }

    val result = deferred.await()
    println("Result: $result")
}

В каких случаях стоит использовать асинхронные вызовы и как это улучшает производительность?

Асинхронные вызовы стоит использовать, когда выполнение задачи может занять значительное время, например:

  • Сетевые запросы.

  • Работа с файловой системой.

  • Обработка больших объемов данных.

Использование асинхронных вызовов улучшает производительность за счет:

  • Освобождения основного потока для обработки пользовательского интерфейса, что предотвращает “замораживание” приложения.

  • Параллельного выполнения нескольких задач, что сокращает общее время выполнения.

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

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

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

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

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

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

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

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

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

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

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

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