Coroutine의 Job

김재원·2022년 4월 21일
1

코루틴

목록 보기
3/3
post-thumbnail

Job은 Kotlin Coroutine을 컨트롤하기 위한 것입니다. Job을 통해서 하나 혹은 여러개의 coroutine을 제어할 수 있습니다.

Coroutine을 사용하다 보면 복잡한 작업을 해야할 때가 있습니다. 예를 들어 여러개의 코루틴을 합쳐야 하거나, 코루틴을 원하는 시점에 시작, 종료해야 하는 작업등이 있을 수 있습니다. 이때 coroutine의 Job을 사용합니다.

Job의 상태

코루틴의 Job은 다음과 같은 6가지의 상태를 가집니다. 이 상태들을 확인하고, 상태를 바탕으로 제어할 수 있습니다.

isActive, isCompleted, isCancelled는 다음과 같이 확인할 수 있습니다.

val job = launch{
	//coroutine
}

job.isActive // isActive(Boolean)반환
job.isCancelled // isCancelled(Boolean)반환
job.isCompleted // isCompleted(Boolean)반환

Job의 메소드(할 수 있는 것)

  • 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 활용하기

Job은 다음과 같이 1개의 launch를 관리할 수 있습니다.

val job = CoroutineScope(Dispatcher.IO).launch{
   // coroutine
}

하지만 Android개발을 하다보면 여러개의 Job을 관리해야 할 때가 있습니다. 이럴때는 하나의 Job을 생성하고 N개의 launch, actor등을 관리할 수 있습니다.

val job = Job() // 하나의 Job 생성
  • CoroutineScope에 job을 함께 초기화하면 CoroutineScope의 자식까지 모두 관리할 수 있습니다.
    CoroutineScope(Dispatchers.Default + job)
  • launch에만 적용할 수 있습니다.
    .launch(Dispatchers.IO + job)

이렇게 해서 Coroutine의 Job에 대해 알아보았습니다.

참고
kotlinx.coroutines - Job
Kotlin Coroutines의 Job 동작을 알아보자 - Taehwan

profile
항상 배울 것을 찾는 개발자입니다🔥.

0개의 댓글