Для создания корутины нужен построитель корутин. И одним из построителей корутин в пакете kotlinx.coroutines
является функция
launch. В принципе в прошлых темах уже было рассмотрено, как с помощью launch
создавать корутины. Сейчас же рассмотрем некоторые аспекты подробнее.
Прежде всего, launch()
, как правило, применяется, когда нам не надо возвращать результат из корутины и когда нам ее надо выполнять одновременно
с другим кодом.
Построитель корутин launch возвращает объект Job, с помощью которого можно управлять запущеной корутиной:
val job: Job = launch{ println("Some coroutin") delay(400L) }
Например, его метод join() позволяет ожидать, пока корутина не завершится. Например:
import kotlinx.coroutines.* suspend fun main() = coroutineScope{ launch{ for(i in 1..5){ println(i) delay(400L) } } println("Start") println("End") }
В данном случае мы получим следующий консольный вывод:
Start End 1 2 3 4 5
Теперь явным образом применим интерфейс Job:
import kotlinx.coroutines.* suspend fun main() = coroutineScope{ val job = launch{ for(i in 1..5){ println(i) delay(400L) } } println("Start") job.join() // ожидаем завершения корутины println("End") }
Здесь корутина также запускается с помощью launch
, однако благодаря методу join()
полученного объекта Job
функция main остановит выполнение и будет ожидать завершения корутины и только после ее завершения продолжит работу. Соответственно в данном случае консольный вывод будет
иным:
Start 1 2 3 4 5 End
По умолчанию построитель корутин launch создает и сразу же запускает корутину. Однако Kotlin также позволяет применять технику отложенного запуска корутины (lazy-запуск), при котором корутина запускается при вызове метода start() объекта Job.
Для установки отложенного запуска в функцию launch()
передается значение start = CoroutineStart.LAZY
Чтобы увидеть разницу, сначала возьмем корутину со стандартным выполнением:
import kotlinx.coroutines.* suspend fun main() = coroutineScope{ // корутина создана и запущена launch( ) { delay(200L) println("Coroutine has started") } delay(1000L) println("Other actions in main method") }
Чтобы позволить корутины выполниться до остальных действий в методе main, после определения корутины установлена задержка в 1 секунду. В итоге здесь получим следующий консольный вывод:
Coroutine has started Other actions in main method
Теперь применим отложенное выполнение:
import kotlinx.coroutines.* suspend fun main() = coroutineScope{ // корутина создана, но не запущена val job = launch(start = CoroutineStart.LAZY) { delay(200L) println("Coroutine has started") } delay(1000L) job.start() // запускаем корутину println("Other actions in main method") }
Теперь корутина только создается с помощью функции launch
, но непосредственно она запускается только при вызове метода job.start()
, соответственно мы получим другой результат
программы:
Other actions in main method Coroutine has started