Найти в Дзене

Корутины vs потоки

Мы все знаем, что когда-то давно единственным способом выполнять что-то в фоне были потоки. Но затем появились корутины и все многие стали использовать их. Почему же так произошло? Поток (Thread) — это отдельный путь выполнения кода, который работает параллельно с другими потоками под контролем операционной системы. Каждый поток: 📌 Потоки управляются операционной системой (ОС), а не Kotlin. Пример с потоками Представим, что у нас есть 5 котиков-курьеров, и каждому дали задание по доставке посылки. Вариант на потоках: ❌ Проблемы потоков Обычные потоки работают так, что операционная система сама решает, когда и какие потоки должны выполняться. Это называется принудительная многозадачность – процессор может в любой момент переключить выполнение с одного потока на другой, даже если первый не закончил работу. Корутины работают по-другому: они сами решают, когда приостановиться, чтобы не мешать другим корутинам. Это называется кооперативная многозадачность – корутина добровольно уступает в
Оглавление

Мы все знаем, что когда-то давно единственным способом выполнять что-то в фоне были потоки. Но затем появились корутины и все многие стали использовать их. Почему же так произошло?

🔥 Потоки: старый и надежный метод

Поток (Thread) — это отдельный путь выполнения кода, который работает параллельно с другими потоками под контролем операционной системы.

Каждый поток:

📌 Потоки управляются операционной системой (ОС), а не Kotlin.

Пример с потоками

Представим, что у нас есть 5 котиков-курьеров, и каждому дали задание по доставке посылки. Вариант на потоках:

❌ Проблемы потоков

  1. Тяжелый запуск: ОС создает поток, выделяет ему память, инициализирует, а затем следит за ним. Это дорого.
  2. Ограниченное количество потоков: если запустить слишком много потоков (1000+), система начнет задыхаться.
  3. Контекстное переключение дорого: переключение между потоками занимает миллисекунды (звучит мало, но это много!).
  4. Нет простого управления: нужно вручную управлять потоками, использовать join(), synchronized, ThreadPoolExecutor и т.п..

🚀 Корутины: легковесные и умные

Как работают корутины?

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

Корутины работают по-другому: они сами решают, когда приостановиться, чтобы не мешать другим корутинам. Это называется кооперативная многозадачность – корутина добровольно уступает выполнение другим, например, когда делает delay(), ждет ответа от сервера или завершения сложного вычисления.

Главное отличие:

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

📌 Корутина управляется Kotlin Runtime, а не ОС.

Пример с корутинами

Те же 5 котиков, но теперь они работают по-умному:

-2

✅ Почему корутины удобней?

  1. Легковесность: корутины не создают отдельные потоки, а используют уже существующие. Можно запустить сотни тысяч корутин, не перегружая систему.
  2. Приостановка вместо блокировки: в Thread.sleep(1000), поток просто простаивает и тратит ресурсы. В delay(1000), корутина отпускает поток и позволяет другим задачам выполняться.
  3. Нет затрат на контекстное переключение: переключение между потоками занимает миллисекунды. Переключение между корутинами – наносекунды.
  4. Простое управление: запуск (launch, async), отмена (cancel()), ожидание (join()) – всё проще, чем с потоками.

💡 Как корутины работают внутри?

На низком уровне корутины используют пул потоков (Dispatchers) и механизм suspend.

  1. Корутина стартует в пуле потоков. Например, если Dispatchers.IO, она возьмет один из потоков в IO-пуле. Если Dispatchers.Default – возьмет поток из Default-пула.
  2. Корутина может приостановиться и освободить поток.
  3. Корутина возобновляется, когда данные готовы. Например, при запросе в сеть корутина приостанавливается и не занимает поток. Как только ответ получен, она возобновляется на том же или другом потоке.

⚡ Производительность: Корутины vs Потоки

Я сделала простенький тест с замером параметров. Тут все потоки и корутины создавались без каких-либо действий внутри, поэтому памяти там выделялось достаточно мало.

-3

Вывод: корутины эффективнее потоков

Знаете ли вы ситуации, когда потоки лучше? (да, такое тоже бывает)

-4

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes