Многопоточное программирование в Kotlin
Корутины в Kotlin — одна из «больших фичей», как было сказано JetBrains. Мы все знаем, что блокировка при высоких нагрузках и частые опросы — не самые блестящие идеи, а мир становится всё более и более push-based и асинхронным.
Многие языки (начиная с C# в 2012 году) поддерживают асинхронное программирование благодаря специальным языковым конструкциям, например, ключевым словам async/await. В Kotlin эта концепция была обобщена, чтобы библиотеки могли определять версии таких конструкций, а async превратился из ключевого слова в простую функцию. Такой дизайн позволяет интегрировать различные асинхронные API: futures/promises, callback-passing и т.д. Он также подходит для выражения ленивых генераторов (yield) и других вариантов использования.
Какова практическая польза?
Итак, корутины — новая классная фича в языке Kotlin (пусть пока и экспериментальная), которая позволяет писать асинхронный код более естественно — вы сможете писать асинхронный код в своём проекте точно так же, как обычно пишете синхронный.
Для асинхронного программирования вам, возможно, приходилось использовать Async Task’и, Thread’ы (которые могли блокировать, эх...), Callback’и или даже RxJava. Использование callback’ов могло вогнать в так называемый «Ад callback’ов» — привет всем JS-программистам, которые это читают. А в RxJava я заметил довольно сложную кривую обучения, которую нужно покорить, чтобы понять, как использовать комбинаторы для соединения нескольких асинхронных вызовов.
В документации Kotlin сказано, что корутины — легковесная альтернатива потоков. Они предлагают способ избежать блокировки потока и заменить его более дешевой и контролируемой операцией.
Команда Kotlin представила корутины для простой реализации многопоточного программирования. Наверняка многие из читателей уже работали с какими-то инструментами многопоточности на базе потоков, например Concurrency API в Java. Я много работал с многопоточным кодом в Java и убеждён в развитости API.
Корутины проще в использовании, но есть несколько правил. Основная идея заключается в том, что корутины — просто блоки кода, которые можно приостанавливать, не блокируя поток. Отличие в том, что блокировка потока не позволяет ему больше ничего делать, в то время как приостановка означает, что он может делать другие вещи, ожидая завершения приостановленного блока.
Полезная статья на тему
Хотите узнать больше? Задавайте вопросы в комментариях!