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

Что такое launch в Coroutines?

2.7 Senior🔥 221 комментариев
#Kotlin основы#Архитектура и паттерны#Многопоточность и асинхронность

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

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

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

Что такое launch в Kotlin Coroutines?

В библиотеке Kotlin Coroutines, функция launch — это корутин-билдер (coroutine builder), который запускает новую сопрограмму (coroutine) без блокирования текущего потока и не возвращает результат вызывающей стороне напрямую. Это асинхронная операция, предназначенная для выполнения фоновых задач, которые не требуют немедленного возврата значения.

Основные характеристики launch

  • Запуск фоновой задачи: launch используется, когда нужно выполнить какую-то работу "в фоне", не дожидаясь её завершения в текущем потоке (например, в UI-потоке Android).
  • Возвращает Job: Вместо результата функции launch возвращает объект типа Job. Этот объект является дескриптором запущенной сопрограммы и позволяет управлять её жизненным циклом: отменять (cancel), дожидаться завершения (join) или следить за её состоянием.
  • Используется для side-effects: Операции, которые изменяют состояние приложения (например, сохранение в базу данных, логирование, обновление UI после вычислений), но не возвращают данные вызывающему коду.
  • Работает в CoroutineScope: Функция launch является функцией-расширением для CoroutineScope. Это обеспечивает структурную конкурентность (structured concurrency), так как жизненный цикл запущенной сопрограммы привязан к жизненному циклу области видимости (scope).

Базовый синтаксис и пример

import kotlinx.coroutines.*

fun main() = runBlocking { // Создаём корутин-скоп
    // Запускаем новую сопрограмму в этом скопе
    val job: Job = launch {
        // Это тело сопрограммы (suspending function block)
        delay(1000L) // Приостанавливаем на 1 секунду, не блокируя поток
        println("World!") // Выполнится после задержки
    }
    println("Hello,") // Выполнится немедленно, пока сопрограмма delay'ится
    job.join() // Ожидаем завершения работы сопрограммы, прежде чем завершить runBlocking
}
// Вывод:
// Hello,
// World!

Контекст и диспетчеры

При запуске можно указать контекст (корутин-контекст), ключевым элементом которого часто является диспетчер (CoroutineDispatcher). Диспетчер определяет, на каком потоке или пуле потоков будет выполняться сопрограмма.

launch(Dispatchers.IO) {
    // Выполнится на пуле потоков для I/O операций (сеть, БД, файлы)
    fetchDataFromNetwork()
}

launch(Dispatchers.Main) { // Требует зависимости kotlinx-coroutines-android
    // Выполнится на основном UI-потоке (Android)
    updateTextView()
}

launch(Dispatchers.Default) {
    // Выполнится на пуле потоков для CPU-интенсивных задач (сортировка, вычисления)
    computeHeavyAlgorithm()
}

Управление через Job

Возвращаемый объект Job — мощный инструмент управления:

val job = launch {
    // Долгая задача
}

// ... где-то в коде позже
if (someCondition) {
    job.cancel() // Отменяет выполнение сопрограммы
}

// Или ожидание завершения:
job.join() // Сопрограмма, вызвавшая join, приостанавливается до завершения job
println("Задание завершено")

Отличие от async

Важно не путать launch с другим корутин-билдером — async. Ключевое отличие:

  • launch — запускает задачу и возвращает Job (без результата).
  • async — запускает задачу и возвращает Deferred<T> (отложенное значение), которое представляет собой Job с возможностью получить результат (await()).
// Пример с launch (для side-effect)
launch {
    val data = fetchData() // Предположим, эта функция что-то возвращает
    updateUi(data)         // Но результат используется внутри, а не возвращается
}

// Пример с async (для получения результата)
val deferredResult: Deferred<String> = async {
    fetchData() // Результат этой функции будет "упакован" в Deferred
}
// ... позже, в другом месте или в другой сопрограмме
val result: String = deferredResult.await() // Получаем результат

Практическое использование на Android

В Android launch чаще всего используется внутри viewModelScope или lifecycleScope, чтобы автоматически отменять фоновые операции при уничтожении ViewModel или жизненного цикла UI-компонента, предотвращая утечки памяти.

class MyViewModel : ViewModel() {
    fun loadUserData() {
        viewModelScope.launch(Dispatchers.IO) {
            // Безопасная фоновая операция
            val user = repository.getUser()
            withContext(Dispatchers.Main) { // Переключаемся на Main для UI
                _userLiveData.value = user
            }
        }
        // При очистке viewModelScope (onCleared) эта корутина будет автоматически отменена
    }
}

Итог: launch — это фундаментальный строительный блок для работы с Kotlin Coroutines, предназначенный для запуска фоновых задач, не возвращающих результат напрямую. Он обеспечивает асинхронное выполнение кода, управление через объект Job и является основой для реализации структурной конкурентности в приложениях, особенно на платформе Android.