launch и Job

Последнее обновление: 21.06.2021

Для создания корутины нужен построитель корутин. И одним из построителей корутин в пакете kotlinx.coroutines является функция launch. В принципе в прошлых темах уже было рассмотрено, как с помощью launch создавать корутины. Сейчас же рассмотрем некоторые аспекты подробнее.

Прежде всего, launch(), как правило, применяется, когда нам не надо возвращать результат из корутины и когда нам ее надо выполнять одновременно с другим кодом.

Job

Построитель корутин 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 метод функция остановит выполнение и будет ожидать завершения корутины и только после ее завершения продолжит работу. Соответственно в данном случае консольный вывод будет иным:

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
Помощь сайту
WebMoney
  • P378451176208
  • Z280152397659
ЮMoney/Яндекс-Деньги
  • 410011174743222
PayPal
  • metanit22@mail.ru
Перевод на карту
  • Номер карты: 4048415020898850