---
title: Coroutine
seo:
  title: Coroutine — Kotlin Developer
  description: Тема «Coroutine» для собеседования Kotlin Developer. Что представляют собой корутины в Kotlin? Что такое coroutine и как они реализуются в Kotlin?
---

[Все темы Kotlin Developer](/kotlin-developer)

## <strong>Что представляют собой корутины в Kotlin?</strong> [#q-14bee738d69b815fa47cd1bf70f0ab0e]

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

:::note[Ссылки для изучения]

1. [Ликбез по корутинам](https://habr.com/ru/companies/otus/articles/766774/)
   :::

---

## <strong>Что такое</strong> <code>coroutine</code> <strong>и как они реализуются в Kotlin?</strong> [#q-14bee738d69b81079f55c21490c27ede]

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

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

Пример&#58;

```kotlin
import kotlinx.coroutines.*

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

:::note[Ссылки для изучения]

1. [Ликбез по корутинам](https://habr.com/ru/companies/otus/articles/766774/)
   :::

---

## <strong>Как использовать</strong> <code>launch</code> <strong>и</strong> <code>runBlocking</code> <strong>в Kotlin?</strong> [#q-14bee738d69b816794c1e9b9aa7ec43f]

Использование <code>launch</code> и <code>runBlocking</code>&#58;

- <code>launch</code>&#58; Запускает новую корутину без блокировки текущего
  потока. Используется для выполнения асинхронных задач, которые не возвращают
  результат.

  ```kotlin
  import kotlinx.coroutines.*

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

- <code>runBlocking</code>&#58; Запускает корутину и блокирует текущий поток до
  завершения выполнения всех вложенных корутин. Обычно используется для тестов
  или в <code>main</code> функции.

  ```kotlin
  import kotlinx.coroutines.*

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

:::note[Ссылки для изучения]

1. [Ликбез по корутинам](https://habr.com/ru/companies/otus/articles/766774/)
   :::

---

## <strong>Объясните разницу между</strong> <code>suspend</code> <strong>функцией и обычной функцией.</strong> [#q-14bee738d69b81ca88e8cda91a4687b2]

Разница между обычной и <code>suspend</code> функцией&#58;

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

  ```kotlin
  suspend fun doSomething() {
      delay(1000L)
      println("Done")
  }
  ```

- <strong>Обычная функция</strong>&#58; Функция, которая выполняется
  последовательно и не может быть приостановлена. Не может вызывать suspend
  функции напрямую.

:::note[Ссылки для изучения]

1. [Ликбез по корутинам](https://habr.com/ru/companies/otus/articles/766774/)
   :::

---

## <strong>Какие преимущества дают</strong> <code>coroutines</code> <strong>по сравнению с классическими потоками?</strong> [#q-14bee738d69b815a9dd7f57f1ba85ff8]

Преимущества <code>coroutines</code> перед классическими потоками&#58;

- <strong>Легковесность</strong>&#58; Корутины потребляют меньше ресурсов, чем
  потоки. Тысячи корутин могут работать одновременно, в отличие от потоков.

- <strong>Простота синтаксиса</strong>&#58; Корутины позволяют писать
  асинхронный код в синхронном стиле, что делает код более читаемым и
  поддерживаемым.

- <strong>Контролируемая конкурентность</strong>&#58; Корутины предоставляют
  более гибкий механизм управления конкурентностью через контексты и диспетчеры
  (<code>Dispatchers</code>).

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

:::note[Ссылки для изучения]

1. [Ликбез по корутинам](https://habr.com/ru/companies/otus/articles/766774/)
   :::
