시배's Android
si8ae
시배's Android
Kotlin Coroutines Deep Dive | 8장. 잡과 자식 코루틴 기다리기 본문
- 자식은 부모로부터 컨텍스트를 상속받습니다.
- 부모는 모든 자식이 작업을 마칠 때까지 기다립니다.
- 부모 코루틴이 취소되면 자식 코루틴도 취소됩니다.
- 자식 코루틴에서 에러가 발생하면, 부모 코루틴 또한 에러로 소멸합니다.
Job 이란
- 잡은 수명을 가지고 있으며 취소 가능합니다.
- 잡은 인터페이스이긴 하지만 구체적인 사용법과 상태를 가지고 있다는 점에서 추상 클래스처럼 다룰 수도 있습니다.
- 잡의 수명은 상태로 나타냅니다.
- Active 상태에서는 잡이 실행되고 코루틴은 잡을 수행합니다.
- 대부분의 코루틴은 Active 상태로 시작됩니다.
- 지연 시작되는 코루틴만 New 상태에서 시작됩니다.
- 실행이 완료되면 상태는 Completing으로 바뀌고 자식들을 기다립니다.
- 자식들의 실행도 모두 끝났다면 잡은 마지막 상태인 Completed로 바뀝니다.
- 잡이 실행 도중에 취소되거나 실패하게 되면 Cancelling 상태로 가게 됩니다.
- 후처리 작업이 완료되면 Cancelled 상태가 됩니다.
상태 |
isActive |
isCompleted |
isCancelled |
New (지연 시작될 때 시작 상태) |
false |
false |
false |
Active (시작 상태 기본값) |
true |
false |
false |
Completing (일시적인 상태) |
true |
false |
false |
Cancelling (일시적인 상태) |
false |
false |
true |
Cancelled (최종 상태) |
false |
true |
true |
Completed (최종 상태) |
false |
true |
false |
- async 함수에 의해 반환되는 타입은 Deferred이며, Deferred 또한 Job 인터페이스를 구현하고 있기 때문에 똑같은 방법으로 사용할 수 있습니다.
자식들 기다리기
- 잡의 첫 번째 중요한 이점은 코루틴이 완료될 때까지 기다리는 데 사용될 수 있다는 점입니다.
- join은 지정한 잡이 Completed Cancelled와 같은 마지막 상태에 도달할 때까지 기다리는 중단함수입니다.
잡 팩토리 함수
- Job은 Job() 팩토리 함수를 사용하면 코루틴 없이도 Job을 만들 수 있습니다.
- 팩토리 함수로 생성하는 잡은 어떤 코루틴과도 연관되지 않으며, 컨텍스트로 사용될 수 있습니다.
- 흔한 실수 중 하나는 Job 팩토리 함수를 사용해 잡을 생성하고 다른 코루틴의 부모로 지정한 뒤에 join을 호출하는 것입니다.
- 자식 코루틴이 모두 끝마쳐도 Job이 여전히 액티브 상태에 있기 때문에 프로그램이 종료되지 않습니다.
- 팩토리 함수로 만들어진 잡은 다른 코루틴에 의해 여전히 사용될 수 있기 떄문입니다.
- Job은 생성자처럼 보이는 간단한 함수로, 가짜 생성자입니다.
- 팩토리 함수가 반환하는 실제 타입은 Job이 아니라 하위 인터페이스인 CompletableJob입니다.
- complete() : 잡을 완료하는 데 사용됩니다.
- complete를 호출한 잡에서 새로운 코루틴이 시작될 수는 없습니다.
- completeExceptionally(exception) : 인자로 받은 예외로 잡을 완료시킵니다.