앞선 4번 글에서 코루틴 빌더인 launch 메서드를 사용했을 때 Job이 생성되는 것을 볼 수 있었다. Job은 결과가 없는 비동기 작업으로 예외가 발생하지 않는 이상 끝까지 수행되었었다.
이번 글에서는 Job 비동기 작업을 실행하는 시점과, 실행 방법을 조절하는 것에 대해 더욱 깊숙이 다뤄볼 것이다.
Job의 생성
코루틴 빌더인 launch 메서드를 별도의 옵션 없이 사용하면 생성된 비동기 작업(Job)은 생성 후에 바로 실행된다.
fun main() = runBlocking<Unit> {
val job = launch {
println(1)
}
}
// 1 출력
예를 들면 위와 같이 Job을 생성할 경우 이 Job은 생성과 동시에 실행된다. 이러한 방식으로 Job을 생성하면 필요한 위치에 바로 생성해서 실행시켜야 하기 때문에 코루틴 실행의 유연성이 떨어질 수 밖에 없다.
이를 해결하기 위해 Job을 생성한 후 필요할 때 코루틴이 스레드에 보내져 실행되도록 만드는 옵션이 있다.
Job을 Lazy하게 실행하기
Job을 생성한 후 바로 실행되는 것을 막기 위해서는 아래와 같이 Job을 생성하는 launch 메서드에 CoroutineStart.LAZY 인자를 넘겨야 한다.
fun main() = runBlocking<Unit> {
val job = launch(start = CoroutineStart.LAZY) {
println(1)
}
}
// 아무것도 출력되지 않음
위와 같이 Job이 생성되면 해당 Job은 실행되지 않고 실행 대기 상태(생성 상태)가 된다. 우리는 이것을 Job이 지연 실행된다고 한다.
이제 지연 실행이 설정된 Job을 실행하는 방법을 알아보자.
Lazy하게 생성된 Job을 실행하는 두가지 방법: start()
Lazy하게 생성된 Job은 start() 메서드를 통해 실행 가능하다.
start() : 곧바로 실행
먼저 start()를 살펴보자. start()는 생성된 코루틴을 즉시 실행시킨다. 따라서 start()가 호출되면 코루틴이 실행되며, 결과가 출력된다.
fun main() = runBlocking<Unit> {
val job = launch(start = CoroutineStart.LAZY) {
println("가나다")
}
job.start()
}