Job의 상태 변수 : isActive, isCancelled, isCompleted
Job의 상태 변수는 세가지가 있는데 <그림4>의 방식으로 접근이 가능하다.
이 상태 변수들은 다음과 같이 설명될 수 있다.
- isActive: Job이 실행중인지 여부를 표시
- isCancelled: Job cancel이 요청되었는지 여부를 표시
- isCompleted: Job의 실행이 완료되었거나 cancel이 완료었는지를 표시
자세한 상태변화를 아래 예시와 함께 알아보자.
Job이 CoroutineStart.LAZY 옵션으로 생성되었을 때 상태 변화
Job을 생성됨에서 실행중 상태로 자동으로 넘기지 않기 위해 CoroutineStart.LAZY 옵션을 이용해 Job의 상태변수를 다루어보자.
isActive | isCancelled | isCompleted | 비고 | |
생성됨 | false | false | false | CoroutineStart.LAZY로 생성 |
실행 중 | true | false | false | start()혹은 join() 실행 |
Job이 CoroutineStart.LAZY로 생성되면 Job은 생성됨(New)상태에 머문다. 이 때는 실행중도 아니고, 취소도 요청되지 않았고, 완료되지도 않았으므로 isActive, isCancelled, isCompleted가 모두 false이다.
이제 start()혹은 join()을 통해 Job이 실행 중 상태로 바뀌면 isActive가 false에서 true로 바뀐다.
Job이 Cancel되었을 때 상태 변화
다음으로는 Job의 cancel이 호출되었을 때 해당 상태에 어떤 일이 일어나는지 알아보자.
isActive | isCancelled | isCompleted | |
실행 중 | true | false | false |
취소 중 | false | true | false |
취소 완료 | false | true | true |
먼저 Job은 취소 중 상태로 바뀐다. isCancelled는 취소가 요청되었는지에 대한 변수로 cancel이 호출되면 항상 true가 된다. 하지만, 취소 중인 상태에서는 취소가 완료(Complete)되지 않았으므로 isCompleted가 false이다.
만약 취소가 완료되면 isCompleted는 true로 바뀐다. invokeOnCompletion은 isCompleted의 상태를 관찰하는 메서드로 isCompleted가 false에서 true로 바뀔 때 호출된다. 따라서 취소가 완료되었을 때도 호출된다.
Job이 완료되었을 때 상태 변화
Job가 완료되었을 때는 다음과 isActive가 true에서 false로 바뀌며 isCompleted가 false에서 true로 바뀐다.
isActive | isCancelled | isCompleted | |
실행 중 | true | false | false |
실행 완료 | false | false | true |
isCompleted가 false에서 true로 바뀌었으므로 위 cancel과 마찬가지로 invokeOnCompletion 을 통해 설정된 람다식이 호출된다.
정리
위 내용을 정리하면 다음과 같다.
isActive | isCancelled | isCompleted | |
생성됨(New) | false | false | false |
실행 중(Active) | true | false | false |
실행 완료(Completed) | false | false | true |
취소 중(Cancelling) | false | true | false |
취소 완료(Cancelled | false | true | true |
*Job의 상태 접은글
- 생성(New) : Job이 생성된다.
- 실행 중(Active) : Job이 실행 중이다.
- 실행 완료(Completed) : Job의 실행이 완료되었다.
- 취소 중(Cancelling) : Job이 취소되는 중이다. Job에 취소가 요청되면 곧바로 취소되는 것이 아니라, 취소 플래그(isCancelled)만 true로 바꾸고 취소를 확인하는 시점에 취소되므로 취소 중 상태가 있다.
- 취소 완료(Cancelled) : Job의 취소가 완료되었다.