launch

코루틴을 만드는 코루틴 빌더 (CoroutineBuilder)

launch

launch


코루틴을 만드는 코루틴 빌더로 Job 객체를 반환하고 비동기 작업 수행에 대한 결과값을 반환하지 않지 않는다.

join()

Job 객체는 생성과 동시에 실행되는데 매번 필요한 위치에서 Job 을 생성하고 실행하는 것은 코루틴 실행에 있어서 유연하지 않게 된다.

이러한 문제점을 해결하기 위해서는 Job 을 생성한 후에 필요할 때 실행되도록 해야하는데 join() 을 호출하면 Job 이 실행되고 있는 코루틴을 일시 중단시키고 Job 이 종료될 때까지 대기한다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    println("Start")
    
    job1.join()
    job2.join()
    // or joinAll(job1, job2)

    println("End")
}

val job1: Job = GlobalScope.launch {
    var i = 0
    while (i < 3) {
        delay(1000)
        println("Running1 $i")
        i++
    }
}

val job2: Job = GlobalScope.launch {
    var i = 0
    while (i < 3) {
        delay(1000)
        println("Running2 $i")
        i++
    }
}


// 결과는 실행 시 마다 다름
// Start
// Running2 0
// Running1 0
// Running2 1
// Running1 1
// Running1 2
// Running2 2
// End


start()

코루틴 빌더 launchstart() 파라미터에 CoroutineStart.Lazy 를 할당하면 해당 코루틴을 호출하는 시점에 실행되도록 할 수 있지만 join() 과 다르게 start() 는 실행만 시키고 종료를 대기하지 않는다. (non-blocking)

import kotlinx.coroutines.*

// job.start()
fun main() = runBlocking {
    println("Start")
    job.start()
    println("End")
}

val job: Job = GlobalScope.launch(start = CoroutineStart.LAZY) {
    var i = 0
    while (i < 3) {
        delay(1000)
        println("Running $i")
        i++
    }
}


// Start
// End
// Running 0
// Running 1
// Running 2
import kotlinx.coroutines.*

// job.join()
fun main() = runBlocking {
    println("Start")
    job.join()
    println("End")
}

val job: Job = GlobalScope.launch(start = CoroutineStart.LAZY) {
    var i = 0
    while (i < 3) {
        delay(1000)
        println("Running $i")
        i++
    }
}


// Start
// Running 0
// Running 1
// Running 2
// End


cancel()

Job 을 취소하는 것은 cancel() 을 호출하면 된다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    println("Start")
    job.cancel()
    println("End")
}

val job: Job = GlobalScope.launch {
    var i = 0
    while (i < 3) {
        delay(1000)
        println("Running $i")
        i++
    }
}


// Start
// End



Job 의 상태


Job 의 상태는 생성(New), 실행 중(Active), 완료 중(Completing), 실행 완료(Completed), 취소 중(Cancelling), 취소 완료(Cancelled) 6가지이며 isActive, isCanceled, isCompleted 로 확인할 수 있다.

  • 기본적으로는 자동으로 실행 중(Active) 상태가 된다.
  • start() 파라미터에 CoroutineStart.Lazy 를 할당하여 코루틴을 실행하는 경우에는 기본적으로 생성(New) 상태이고, 해당 코루틴을 호출하는 시점에 실행 중(Active) 상태가 된다.
  • 완료 중(Completing) 혹은 취소 중(Cancelling) 상태에서는 완료 전에 리소스 반환 등의 작업을 한다.
essential