Job은 Kotlin Coroutine을 컨트롤하기 위한 것입니다. Job을 통해서 하나 혹은 여러개의 coroutine을 제어할 수 있습니다.
Coroutine을 사용하다 보면 복잡한 작업을 해야할 때가 있습니다. 예를 들어 여러개의 코루틴을 합쳐야 하거나, 코루틴을 원하는 시점에 시작, 종료해야 하는 작업등이 있을 수 있습니다. 이때 coroutine의 Job
을 사용합니다.
코루틴의 Job은 다음과 같은 6가지의 상태를 가집니다. 이 상태들을 확인하고, 상태를 바탕으로 제어할 수 있습니다.
isActive, isCompleted, isCancelled는 다음과 같이 확인할 수 있습니다.
val job = launch{
//coroutine
}
job.isActive // isActive(Boolean)반환
job.isCancelled // isCancelled(Boolean)반환
job.isCompleted // isCompleted(Boolean)반환
start(): job을 실행합니다. start()의 반환값은 Boolean입니다. 호출했을 때 코루틴이 동작중이면 true, 준비 또는 완료상태면 false를 반환합니다.
start로 생성된 job은 중단(suspend) 없이 실행됩니다. 따라서 CoroutineScope안에서 실행하지 않아도 됩니다.
대신 start를 호출한 스레드가 종료되면 job도 같이 종료됩니다.
fun main() {
val job = CoroutineScope(Dispatchers.IO).launch(
start = CoroutineStart.LAZY
) {
print("print!!")
}
job.start()
}
위 코드는 job.start()함수를 호출한 MainThread가 종료되면 IO 스레드도 같이 종료되기 때문에 "print!!"가 출력되지 않습니다.
join(): job을 실행합니다. 대신 start()와 다르게 Job의 동작이 완료될 때 까지 join을 호출한 코루틴을 일시중단합니다.
suspend fun main() {
val job = CoroutineScope(Dispatchers.IO).launch(start = CoroutineStart.LAZY) {
print("print!!")
}
job.join()
}
MainThread가 job이 끝날 때 까지 일시중단되기 때문에 "print!!"가 출력 됩니다.
cancel(): 현재 코루틴에 종료를 유도하고 start()
와 마찬가지로 대기하지 않습니다(CoroutineScope 밖에서 호출해도 무관). 만약 타이트하게 동작하는 반복문에 delay가 없다면 종료하지 못합니다.
cancelAndJoin(): 현재 코루틴을 즉시 종료하라는 신호를 보낸 후 정상 종료될 때까지 대기합니다(join()
과 비슷).
cancelChildren(): CoroutineScope 내에 작성한 자식 코루틴들을 종료합니다. cancel과 다르게 하위 아이템들만 종료하며, 상위 코루틴은 취소하지 않습니다.
Job
은 다음과 같이 1개의 launch를 관리할 수 있습니다.
val job = CoroutineScope(Dispatcher.IO).launch{
// coroutine
}
하지만 Android개발을 하다보면 여러개의 Job을 관리해야 할 때가 있습니다. 이럴때는 하나의 Job을 생성하고 N개의 launch, actor등을 관리할 수 있습니다.
val job = Job() // 하나의 Job 생성
CoroutineScope(Dispatchers.Default + job)
.launch(Dispatchers.IO + job)
이렇게 해서 Coroutine의 Job에 대해 알아보았습니다.
참고
kotlinx.coroutines - Job
Kotlin Coroutines의 Job 동작을 알아보자 - Taehwan