← Назад к вопросам

Что такое корутины в Kotlin?

2.0 Middle🔥 231 комментариев
#Kotlin основы#Многопоточность и асинхронность

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

🧵 Что такое корутины в Kotlin? Объяснение для собеседования

Корутины в Kotlin — это легковесные потоки выполнения (threads-like), предназначенные для асинхронного, неблокирующего программирования. Они представляют собой более эффективную и читаемую альтернативу традиционным callback-ам, RxJava или AsyncTask в Android. Главная их цель — упрощение написания асинхронного кода, делая его похожим на синхронный.

🤔 Чем корутины отличаются от потоков (Threads)?

  • Легковесность: одна корутина потребляет очень мало памяти (несколько десятков байт в стеке), в то время как потоки требуют мегабайты. Это позволяет запускать тысячи, даже десятки тысяч корутин одновременно.
  • Не привязаны к потоку: корутина может приостанавливаться (suspend) в одном потоке и возобновляться (resume) в другом. Это ключевое отличие.
  • Кооперативная отмена: корутины можно легко отменять, и они корректно обрабатывают прерывания.

🧩 Ключевые компоненты корутин

1. Suspend-функции

Это функции, которые могут приостанавливать выполнение, не блокируя поток. Они могут быть вызваны только из другой suspend-функции или корутины.

suspend fun fetchUserData(userId: String): User {
    return withContext(Dispatchers.IO) {
        // Симуляция сетевого запроса
        apiService.getUser(userId)
    }
}

2. CoroutineScope

Контекст, определяющий время жизни корутины. На Android часто используются viewModelScope или lifecycleScope.

class MyViewModel : ViewModel() {
    fun loadData() {
        viewModelScope.launch {
            val user = fetchUserData("123")
            updateUI(user)
        }
    }
}

3. CoroutineContext

Содержит:

  • Dispatcher (Dispatchers.Main, Dispatchers.IO, Dispatchers.Default) — определяет, на каком потоке выполняется корутина.
  • Job — управляет жизненным циклом корутины (запуск, отмена).
  • CoroutineExceptionHandler — обработка исключений.

4. Coroutine Builders

  • launch — запускает корутину, которая не возвращает результат (fire-and-forget).
  • async — запускает корутину и возвращает Deferred<T> (аналог Future или Promise).
  • runBlocking — блокирует текущий поток до завершения корутины (используется в тестах или main-функциях).

🔄 Как работает приостановка (suspension)?

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

suspend fun loadDataConcurrently() {
    coroutineScope {
        val deferredUser = async { fetchUserData() }
        val deferredPosts = async { fetchPosts() }
        
        val user = deferredUser.await()   // Приостанавливаемся здесь, но поток не блокируется
        val posts = deferredPosts.await()
        
        // Объединяем результаты
        displayData(user, posts)
    }
}

📱 Практическое применение на Android

  1. Сетевые запросы: Замена Retrofit Callback на suspend-функции.
  2. Работа с базой данных: Использование Room с корутинами.
  3. Параллельное выполнение: Одновременная загрузка данных из нескольких источников.
  4. Обработка событий UI: Асинхронная реакция на клики без блокировки UI-потока.
// Пример: загрузка и отображение данных
lifecycleScope.launch {
    try {
        showLoading()
        val news = newsRepository.fetchLatestNews() // Suspend функция
        val sortedNews = news.sortedByDescending { it.date }
        newsAdapter.submitList(sortedNews)
    } catch (e: IOException) {
        showError(e.message)
    } finally {
        hideLoading()
    }
}

⚠️ Важные аспекты для собеседования

  • Structured Concurrency: Корутины следуют принципу структурированного параллелизма — дочерние корутины завершаются до заверщения родительской. Это предотвращает утечки.
  • Exception Handling: Исключения в корутинах обрабатываются через try/catch или CoroutineExceptionHandler.
  • Отмена (Cancellation): Корректная обработка отмены через проверку isActive или вызов ensureActive().
  • Потокобезопасность: При работе с общими данными используйте Mutex или потокобезопасные структуры.

🆚 Сравнение с альтернативами

КритерийКорутины KotlinRxJavaCallbacks
Кривая обученияНизкаяВысокаяСредняя
Читаемость кодаВысокаяСредняяНизкая (Callback Hell)
ПроизводительностьВысокаяСредняяСредняя
Интеграция с KotlinНативнаяТребует адаптеровРучная

✅ Заключение

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

Что такое корутины в Kotlin? | PrepBro