[Coroutine] 잡(Job)

업데이트:

잡(Job)

한 번 시작된 작업은 예외가 발생하지 않는 한 대기 하지 않는다. 다음과 같이 코루틴 빌더인 launch() 를 사용해 잡을 생성하는 방법이 가장 일반적이다.

runBlocking {
    val job = GlobalScope.launch {
        // Do background task here
    }
}

다음과 같이 Job() 팩토리 함수를 사용 할 수도 있다.

runBlocking {
    val job = Job()
}

라이프 사이클

다음은 잡의 라이플 사이클을 보여주는 다이어그램이다.


라이프싸이클은 다섯 가지의 상태가 있다.

  • New(생성) : 존재하지만 아직 실행되지 않는 잡
  • Active(활성) : 실행 중인 잡, 일시 중단된 잡도 활성으로 간주된다.
  • Completed(완료 됨) : 잡이 더 이상 실행되지 않는 경우
  • Canceling(취소 중) : 실행 중인 잡에서 cancel()이 호출되면 취소가 완료될 때까지 시간이 걸리기도 한다. 이것은 활성과 취소 사이의 중간 상태이다.
  • Cancelled(취소 됨) : 취소로 인해 실행이 완료된 잡. 취소된 잡도 완료로 간주될수 있다.

1. New(생성)

잡은 기본적으로 launch() 나 Job()을 사용해 생성될 때 자동으로 시작된다. 잡을 생성할 때 자동으로 시작되지 않게 하려면 CoroutineStart.LAZY 를 사용해야 한다.

runBlocking {
    val job = GlobalScope.launch(start = CoroutineStart.LAZY) {
        // Do background task here
    }
}

2. Active(활성)

CoroutineStart.LAZY 를 사용한 경우 아래 두 개의 API를 호출하여 잡을 활성화한다.

  • job.start() : 애플리케이션이 잡이 완료되는 것을 기다리지 않는다.
  • job.join() : 애플리케이션이 잡이 완료할 때까지 기다린다.

3. Canceling(취소 중)

잡에 실행을 취소하도록 요청하려면 cancel() 함수를 호출해야 한다.

runBlocking {
    val job = GlobalScope.launch(start = CoroutineStart.LAZY) {
        delay(5000)
    }
    delay(2000)
    job.cancel()
}

4. Cancelled(취소 됨)

취소 또는 처리되지 않은 예외로 인해 실행이 종료된 잡은 취소됨으로 간주된다.

다음과 같이 invokeOnCompletion()을 사용하여 cause를 출력할수 있다.

runBlocking {
    val job = GlobalScope.launch(start = CoroutineStart.LAZY) {
        TODO("Not impletement yet!!")
    }.invokeOnCompletion { cause ->
        cause?.let {
            println("Job cancelled due to ${it.message}")
        }
    }
}

5. Completed(완료 됨)

실행이 중지된 잡은 완료됨으로 간주된다.

잡의 현재 상태 확인

  • isActive : 잡이 활성 상태인지 여부. 잡이 일시 중지인 경우에도 true를 리턴한다.
  • isCompleted : 잡이 실행을 완료했는지 여부
  • isCancelled : 잡 취소 여부. 취소가 요청되면 즉시 true가 된다.

Reference

코틀린 동시성 프로그래밍(에이콘)

댓글남기기